Come evitare il codice spaghetti quando ho un sacco di condizioni? [duplicare]

0

Ho il seguente problema:

  • Un utente può prelevare denaro da 2 sistemi di pagamento (ma il numero di sistemi di pagamento può cambiare in qualsiasi momento in futuro).
  • Se l'utente ha un account fidato su uno di questi sistemi di pagamento, il denaro viene trasferito automaticamente
  • Se l'utente inserisce un nuovo account, deve attendere fino alla fine del mese per poter trasferire denaro a questo account.

Suposse abbiamo i sistemi di pagamento X e Y. Esistono tutte le seguenti informazioni:

  • Possiamo eseguire il ritiro automatico di X (1 - Sì / 0 - No) - colonna 1.
  • Possiamo eseguire il ritiro automatico di Y (1 - Sì / 0 - No) - colonna 2.
  • Abbiamo deficit di X (1 - Sì / 0 - No) - colonna 3.
  • Abbiamo un deficit di Y (1 - Sì / 0 - No) - colonna 4.
  • L'utente ha un account attendibile di X (1 - Sì / 0 - No) - colonna 5.
  • L'utente ha un account attendibile di Y (1 - Sì / 0 - No) - colonna 6.
  • L'utente può ritirare automaticamente X (1 - Sì / 0 - No) - colonna 7.
  • L'utente può ritirare automaticamente Y (1 - Sì / 0 - No) - colonna 8.
  • L'utente può ritirare X alla fine del mese (1 - Sì / 0 - No) - colonna 9.
  • L'utente può ritirare Y alla fine del mese (1 - Sì / 0 - No) - colonna 10.

Nella tabella seguente ho cercato di mostrare tutti i casi d'uso:

Colonna 1; Colonna 2; Colonna 3; Colonna 4; Colonna 5; Colonna 6; Colonna 7; Colonna 8; Colonna 9; Colonna 10

1; 1; 0; 0; 1; 1; 1; 1; 0; 0

1; 1; 1; 0; 1; 1; 0; 1; 1; 0 

1; 1; 0; 1; 1; 1; 1; 0; 0; 1

1; 1; 1; 0; 1; 0; 1; 0; 0; 1

1; 1; 0; 1; 0; 1; 0; 1; 1; 0

1; 1; 1; 1; 1; 1; 0; 0; 1; 1

0; 0; 0; 0; 1; 1; 0; 0; 1; 1

Si prega di avvisare come posso evitare un sacco di if s?

    
posta Dmitro 05.11.2014 - 17:42
fonte

2 risposte

4

Come funziona un meccanismo di regole? Definisci una classe (o una struttura o qualsiasi altra cosa) che definisce una regola:

class Rule {
    bool weCanDoAutoWithdrawX;
    bool weCanDoAutoWithdrawY;
    bool WeHaveDeficitOfX;
    bool WeHaveDeficitOfY;
    ...
}

Ora crea una lista di Rule s e riempila con Rule oggetti che rappresentano le regole che hai descritto nella domanda. Quando si desidera verificare una transazione, consultare l'elenco e verificare se corrisponde alla regola. Se almeno una regola lo fa, approva la transazione.

Se non si ha familiarità con OOP, è possibile memorizzare i diversi set di condizioni come stringhe di 1 e 0 concatenati ("1100111100", "1110110110", ecc.) memorizzati in una matrice di stringhe. Quindi puoi attraversare quella matrice. Se almeno una stringa corrisponde ai valori effettivi, approvare la transazione.

    
risposta data 05.11.2014 - 19:05
fonte
0

Siccome non vedo alcuna lingua specificata, usa 'switch'. -Oppure, se usi C, puoi creare una funzione che gestisca ciascun tipo di account, quindi creare un elenco di puntatori di funzione.

typedef void (*Account)(uint32_t aParameter);
static const Account[] = { mondoBurger, goodBurger };

-Se usi C ++, JavaScript o qualsiasi altro linguaggio OOP, puoi creare un oggetto che gestisca ogni tipo di account.

La linea di fondo è: puoi usare il codice modulare. Un "gestore" (che si tratti di una funzione o di un oggetto) per un account. Un "gestore" per ogni tipo di azione che può essere fatto.

Quindi basta installare i gestori in un elenco e passare l'elenco alla funzione di elaborazione.

    
risposta data 05.11.2014 - 18:07
fonte

Leggi altre domande sui tag