Troppo complesso / troppi oggetti?

3

So che questa sarà una domanda difficile a cui rispondere senza contesto, ma spero che ci siano almeno alcune buone linee guida da condividere su questo. Le domande sono in fondo se vuoi saltare i dettagli. La maggior parte riguarda OOP in generale.

Inizia il contesto. Sono un jr dev su un'applicazione PHP, e in generale gli sviluppatori con cui lavoro si considerano in grado di utilizzare molti più concetti OO rispetto alla maggior parte degli sviluppatori PHP. Tuttavia, nella mia ricerca sul codice pulito ho letto su tanti modi di utilizzare le funzionalità di OO per rendere il codice flessibile, potente, espressivo, testabile, ecc. Che è semplicemente non usato qui.

L'attuale OO strongmente OO che ho proposto viene chiamata troppo complessa, anche se è banale da implementare. Il problema che sto risolvendo è che i nostri controlli delle autorizzazioni vengono eseguiti tramite un oggetto messaggio (la mia API, volevano utilizzare matrici di costanti) e l'oggetto messaggio non mantiene l'oggetto di convalida responsabile per il controllo di tutti i dati forniti. Metaforicamente, se la tua perm contenente "ammissibile" e "raro ma non consentito" viene inviata a un validatore, il validatore potrebbe non sapere di cercare "raro ma non consentito", ma approvare "ammesso", che in realtà approverà l'intero controllo perm. Abbiamo 11 validatori, troppi per rintracciare facilmente dettagli così minuti.

Quindi ho proposto una classe AtomicPermission . Per correggere l'esempio precedente, la perm avrebbe invece contenere due permessi atomici, uno avvolgente 'permissibile' e l'altro involucro 'raro ma non consentito'. Dove in precedenza il validatore direbbe "il controllo è OK perché contiene consentito", ora direbbe invece che "" ammesso "è ok", a quel punto il controllo finisce ... e il controllo fallisce, perché "raro ma non consentito" non era specificamente adatto.

L'implementazione è costituita da soli 4 oggetti banali e riscrive una funzione a 10 linee in una funzione a 15 linee.

abstract class PermissionAtom {
public function allow(); // maybe deny() as well
public function wasAllowed();
}

class PermissionField extends PermissionAtom {
public function getName();
public function getValue();
}

class PermissionIdentifier extends PermissionAtom {
public function getIdentifier();
}

class PermissionAction extends PermissionAtom {
public function getType();
}

Dicono che questo "non ci porterà niente di importante" ed è "troppo complesso" e "sarà difficile per i nuovi sviluppatori". Sono rispettosamente in disaccordo, e qui termino il mio contesto per iniziare le domande più ampie.

Quindi la domanda riguarda la mia OOP, ci sono delle linee guida che dovrei sapere:

  1. è questo troppo complicato / troppo OOP? Non che mi aspetto di ottenere più di 'dipende, dovrei vedere se ...'
  2. quando l'astrazione OO è eccessiva?
  3. quando l'astrazione OO è troppo piccola?
  4. come posso determinare quando sto pensando troppo a un problema e a correggerne uno?
  5. come posso determinare quando aggiungo codice errato a un progetto non valido?
  6. come posso inserire queste API? Sento che gli altri sviluppatori preferirebbero semplicemente dire "è troppo complicato" piuttosto che chiedere "puoi spiegarlo?" ogni volta che suggerisco una nuova classe.
posta Mike Fairhurst 22.11.2012 - 02:37
fonte

1 risposta

9

Questa domanda mi piace abbastanza, ma non penso che riguardi realmente OO o API. Si tratta di essere un junior o un nuovo membro di un team e di avere input (idee o esperienze passate) che gli altri membri del team non sono d'accordo.

Risponderò alle tue domande:

  1. Non sembra essere
  2. Quando il problema non garantisce ulteriori astrazioni
  3. Quando il problema merita più astrazione
  4. L'esperienza
  5. L'esperienza
  6. Spiegalo, dimostralo, descrivi i rischi e i benefici di esso.

Questo è tutto molto volutamente vago. Le astrazioni aggiungono complessità e rimuovono la complessità allo stesso tempo - solo diversi tipi di complessità. L'applicazione corretta dipende dalla tua azienda, prodotto, squadra e così via.

I tuoi compagni di squadra potrebbero non supportare la tua idea per una serie di motivi:

  • l'idea non funziona, è scorretta o cattiva pratica, o è solo spazzatura (la tua competenza)
  • ci sono motivi aziendali o di sistema per cui l'idea non funzionerà (la tua esperienza)
  • non vedono i benefici dell'idea oi rischi di non adottare l'idea (la loro esperienza)
  • rifiutano o non riescono a capire l'idea (la loro competenza)
  • stanno affermando la loro anzianità o posizione (politica)

Un problema politico o di competenza non rientra nell'ambito di discussione tecnica dell'idea, è un problema di gestione e spero che non sia questo il problema. È molto probabile che si tratti di un problema di esperienza. Questo non significa che non hai abbastanza esperienza, o che non hanno abbastanza esperienza, ma c'è una disconnessione da qualche parte che ti fa vedere come una buona idea, ma altri a vederlo come una cattiva idea.

Che cosa fai in questa situazione? Discuti l'idea. Se non sono disposti a discutere l'idea con te (e dovresti dare loro l'opportunità di sezionarlo, distruggerlo per te in modo da poterne imparare da loro) poi vedi sopra (ragioni politiche o di competenza). Avere una discussione aperta e franca sulle alternative, in particolare per quanto riguarda le difficoltà di implementazione e la flessibilità futura. Non è la tua idea contro la loro idea; ci sono due approcci sul tavolo e la squadra deve decidere tra di loro.

    
risposta data 22.11.2012 - 04:27
fonte