OOP, SRP e Dama

0

Ho appena iniziato oop e ho deciso di programmare il motore di un checker. Ho poche preoccupazioni sul modo in cui ho strutturato il mio codice e non sono sicuro di non riuscire a capire i principi dietro oop. La mia preoccupazione riguarda la gestione della generazione del movimento e la valutazione del consiglio di amministrazione. Al momento, ho queste due responsabilità separate nelle rispettive classi che usano le altre classi.

Credo che la mia domanda sia se queste responsabilità fossero nelle loro classi o dovessero essere legate a una classe come l'IA? Ma se lego le responsabilità della generazione di mosse e della valutazione della scacchiera ad una classe come l'IA, ciò interrompe l'SRP?

    
posta Jeff Peters 01.05.2018 - 19:46
fonte

2 risposte

2

A (scacchi) Board può mantenere i dati posizionali e accettare le mosse che lo cambiano. È in grado di gestire mosse complesse come la promozione di una pedina a una regina o l'arrocco. Può convalidare le mosse e respingere quelle non valide. Può controllare condizioni come attacco, scacco matto, ecc. La responsabilità della commissione è solo la posizione e il modo in cui rimane corretta.

Un Piece può offrire possibili mosse e attacchi, data la posizione.

Un AI può richiedere un Board e fare una mossa. Così può fare, ad esempio, un po 'di HumanPlayerInterface . L'unica responsabilità di questa interfaccia è fare una singola mossa. Sicuramente la cosa AI avrà molte altre parti mobili dentro ; non cambia la sua unica responsabilità di fare una mossa.

    
risposta data 01.05.2018 - 20:17
fonte
0

Quindi, la cosa su tutti questi principi è che non sono solo lì in modo che il codice abbia un certo fascino estetico - hanno uno scopo pratico. In particolare, si preoccupano di rendere il codice gestibile e di poter cambiare, estendere o sostituire parti di esso senza troppi problemi. Ora, l'SRP riguarda il fatto che le tue classi "fanno una cosa", perché se fanno più di "una cosa", il codice che fa queste diverse cose molto probabilmente si accoppierà in modi sottili e, di conseguenza, diventerà resistente al cambiamento - nel senso che sarà difficile cambiare queste parti separatamente. Il che significa che non si può veramente dire quali siano le responsabilità separate solo osservando quali classi e comportamenti si debbano implementare (nella migliore delle ipotesi si possono fare ipotesi plausibili, ma ciò richiede esperienza).

Invece, devi cercare di capire che cosa è più probabile che cambi e in che modo - e molto probabilmente non riuscirai a farlo correttamente al primo tentativo, anche se hai esperienza. Il tuo codice è un modello software (una rappresentazione) di questo concetto logico che è il sistema che stai cercando di costruire (il concetto che include tutte le forze del mondo reale che possono influenzare ciò che quel sistema è, e come cambierà), e ciò che OO design sta cercando di fare è catturare quali sono le diverse parti di quel sistema, in che modo il sistema cambierà e come mettere insieme questi diversi componenti per soddisfare tutto ciò. E ci sono sempre diversi modi per modellare un tale sistema; alcuni modi funzioneranno meglio di altri nella pratica. Sei tu (o il tuo team) che deve definire cosa significa "cosa singola" o "singola responsabilità" per il sistema che stai cercando di costruire e mantenere (così come quanto lavoro non è "troppo fastidio").

Detto questo, ci sono spesso cose che cambiano a livello di metodo e di classe mentre sviluppiamo il codice, mentre stiamo cercando di capire come implementare alcune funzionalità. Quindi è bene applicare SRP e altri principi in qualche modo preventivamente a questo livello al sottoproblema che stiamo risolvendo, soprattutto perché in questo ambito possiamo predire meglio cosa vorremmo separare, o dove potremmo voler cambiare l'implementazione in un secondo momento. Allo stesso modo quando si tratta di classi strettamente correlate. Quindi, a quel livello, poiché questi sono più o meno i tipi di problemi di programmazione che tutti conosciamo, possiamo provvisoriamente parlare di SRP violati o meno, ma a livello di sistema richiede una comprensione più profonda dei requisiti e sistema stesso, come modellato. A quel livello, è anche importante non sovradimensionare il sistema in anticipo.

Ma torniamo al tuo caso particolare; in generale, sembra una buona idea separarli. Ora, potresti avere un'altra classe (come AI ) che usa gli altri - la sua responsabilità sarebbe quella di coordinare ciò che fanno le altre classi. Basta non spostare il codice da queste altre classi alla classe AI - mantieni ogni pace del codice in un posto separato e lascia che ognuno faccia il proprio lavoro. È una gerarchia di responsabilità, in un certo senso.

Infine, il fatto che tu stia facendo questo per esercitarti, allo scopo di cercare di capire i principi dell'OOP, significa, da un lato, che hai una certa libertà di esplorare, ma dall'altro, che non lo farai ricevere richieste di modifica e segnalazioni di bug da parte dei clienti che alla fine saranno il test di quanto appropriate siano state le tue scelte progettuali. Quindi cerca di compensare in qualche modo. Prendi il tuo attuale design e studialo. Quando si progettano le classi in un certo modo, è sempre un compromesso di qualche tipo: manutenibilità vs complessità, prestazioni vs chiarezza, modularità in qualche modo rispetto a una struttura rigida in altre, ecc. Cerca di capire quali parti del tuo codice sono diventate più facili da cambiare, e quali sono diventati più difficili. Prova a cambiare l'implementazione per verificare se la tua comprensione è corretta. Quindi prova a creare un design diverso e studialo. Cosa è cambiato? Che cosa hai guadagnato e cosa hai perso? Questo ti aiuterà a capire il ragionamento dietro SRP e altri principi, che è ciò che conta davvero.

    
risposta data 02.05.2018 - 02:04
fonte

Leggi altre domande sui tag