Come scrivere condizionali descrittivi per ifs?

1

Ho preso l'abitudine di usare nomi eccessivamente descrittivi. Inoltre, ho anche preso l'abitudine di creare le condizioni per if in questo modo:

bool user_is_female  = user.get_gender() == GENDER_FEMALE;
bool user_is_warrior = user.get_unit_class() == CLASS_WARRIOR;
bool user_can_wear_battle_skirt = user_is_female && user_is_warrior;

if (user_can_wear_battle_skirt) {
    user.equip(EQUIPMENT_BATTLE_SKIRT);
}

Quindi, sì, ho lasciato cadere "== true" o "true ==" che mi è stato insegnato come una buona pratica. Sembra aver bisogno di meno commenti anche. È piuttosto prolisso / lungo però. Stavo per rendere il codice più leggibile. Quindi dovrei continuare ad usare questo metodo? Qualche alternativa?

if (user.can_wear(battle_skirt)) {
    user.equip(battle_skirt);
}

Era un suggerimento che dovevo eliminare perché ho pubblicato nel posto sbagliato.

    
posta user2738698 21.03.2014 - 20:06
fonte

2 risposte

2

Convenzionalmente, le variabili booleane iniziano con verbi is , has o can . Questo ti fornisce un indicatore visivo che la variabile è booleana. Puoi usare camelCase per distinguere tra le parole. Quindi:

canWearBattleSkirt
isWarrior
hasMojo

E così via.

Il tuo chilometraggio può variare; ogni linguaggio di programmazione ha le sue convenzioni per nominare le cose, e talvolta sono simili, ma non sempre.

Detto questo, cose come BattleSkirt, Warrior e Mojo potrebbero essere più adatte come parametri per alcune funzioni come HasCapability(someCapability) . In questo modo, puoi trattare le funzionalità come data e non farle codificare in modo rigido.

    
risposta data 21.03.2014 - 20:17
fonte
0

Un approccio è spostare la decisione sul singolo oggetto. Qualcosa in questo senso:

class BattleSkirt : Item {
    bool mayUse(User user) {
        if (user.get_gender() != GENDER_FEMALE) {
            return false;
        } 
        /* ... */
        return true;
    }
}

if (skirt.may use(user)) {
        user.equip(skirt);
}

Ora questo porta ad alcune duplicazioni in diversi oggetti. Un approccio è quello di mettere quelli in una qualche forma di classi di requisiti. Un articolo quindi può definire i suoi requisiti e quelli possono essere controllati.

class requireFemale : requirement {
    book check(User user) {
        return user.get_gender() != GENDER_FEMALE;
    }
};

class Item {
    book checkRequirements(User user) {
        for each requirement in requirements {
            If (!requirement.check(user)) {
                Return false;
            }
    }
};

class WarriorSkirt : Item {
     Vector<requirement> requirements = { require female() };
}

All'inizio questo è più complesso, ma può rendere questo aspetto più riutilizzabile, specialmente se si consente ai requisiti di ereditare gli uni dagli altri.

    
risposta data 21.03.2014 - 20:30
fonte

Leggi altre domande sui tag