il modo migliore per "introdurre" OOP / OOD a team di ingegneri C ++ esperti

17

Sto cercando un modo efficace, che non sia considerato un insulto, per introdurre i concetti OOP ai membri del team esistenti? I miei compagni di squadra non sono nuovi alle lingue OO. Abbiamo fatto C ++ / C # per molto tempo, quindi la tecnologia stessa è familiare.

Tuttavia, mi guardo intorno e senza una grande infusione di sforzi (principalmente sotto forma di revisioni del codice), sembra che quello che stiamo producendo sia il codice C che si trova all'interno delle classi. Non c'è quasi alcun uso di principi di responsabilità singola, astrazioni o tentativi di minimizzare l'accoppiamento, solo per citarne alcuni. Ho visto classi che non hanno un costruttore ma ottengono memset a 0 ogni volta che vengono istanziati.

Ma ogni volta che apro OOP, tutti annuiscono e fanno sembrare che sappiano esattamente di cosa sto parlando. Conoscere i concetti è buono, ma noi (alcuni più di altri) sembrano averli molto difficili da applicare quando si tratta di fornire un lavoro reale.

Le recensioni di codice sono state molto utili, ma il problema con le revisioni del codice è che si verificano solo dopo il fatto, così a qualcuno sembra che finiamo per riscrivere (è per lo più refactoring, ma richiede ancora molto tempo) il codice appena scritto. Anche le revisioni del codice danno solo feedback ad un singolo ingegnere, non all'intero team.

Sto giocando con l'idea di fare una presentazione (o una serie) e provare a far apparire di nuovo OOP insieme ad alcuni esempi di codice esistente che avrebbe potuto essere scritto meglio e potrebbe essere refactored. Potrei usare alcuni progetti davvero vecchi che nessuno possiede più quindi almeno quella parte non dovrebbe essere un problema delicato. Tuttavia, funzionerà? Come ho detto molte persone hanno fatto C ++ per molto tempo quindi la mia ipotesi è che a) si siederanno lì pensando perché sto dicendo loro cose che già conoscono o b) potrebbero effettivamente prenderlo come un insulto perché io sono dicendo loro che non sanno come fare il lavoro che stanno facendo da anni se non da decenni.

Esiste un altro approccio che raggiungerebbe un pubblico più ampio rispetto a una revisione del codice, ma allo stesso tempo non sembrerebbe una lezione di punizione?

Non sono un bambino appena uscito dal college che ha degli ideali utopici di codice perfettamente progettato e non me lo aspetto da nessuno. Il motivo per cui sto scrivendo questo è perché ho appena fatto una recensione di una persona che in realtà aveva un design decente di alto livello su carta. Tuttavia, se visualizzi le classi: A - > B - > C - > D, nel codice B, C e D tutti implementano quasi la stessa interfaccia pubblica e B / C ha una funzione di linea in modo che la massima classe A stia facendo tutto il lavoro (fino alla gestione della memoria, analisi delle stringhe, negoziazione delle impostazioni. ..) principalmente in 4 metodi mongo e, a tutti gli effetti, chiama quasi direttamente in D.

Aggiornamento: sono un lead tecnologico (6 mesi in questo ruolo) e ho il pieno supporto del group manager. Stiamo lavorando a un prodotto molto maturo e i costi di manutenzione si stanno definitivamente facendo conoscere.

    
posta DXM 28.07.2011 - 10:58
fonte

5 risposte

5

Perché non sviluppi un breve addestramento nei principi SOLID e dai loro questo formazione? Sembra che abbia funzionato abbastanza bene per me nella mia attuale organizzazione e trovo che dare brevi corsi di formazione sia in realtà divertente (per tutte le persone coinvolte).

Quando ho dato il mio addestramento ho impiegato del tempo per cercare esempi "cattivi" patologici nel codice esistente (di vari progetti) e li ho rifattorizzati nella presentazione, passo dopo passo, usando i principi. Questo ha dimostrato che

  1. Non è così difficile fare questi refactoring
  2. Non ci vuole molto tempo
  3. Il risultato finale (scelto con cura ;-)) è chiaramente migliore del codice originale.
risposta data 28.07.2011 - 11:16
fonte
5

Code reviews have been very helpful but the problem with code reviews is that they only occur after the fact.

Su un progetto, abbiamo fatto revisioni di design.

15 minuti. Alla lavagna bianca. Parla attraverso il design prima della codifica.

La parte più importante è la pianificazione della revisione del progetto precedente a qualsiasi lavoro di implementazione.

Abbiamo anche avuto "recensioni critiche sul design" che sono state un grande affare. Hanno coinvolto molti documenti e una lunga presentazione. Erano difficili da pianificare e quasi sempre sono stati eliminati fino a quando la codifica era iniziata, riducendo il loro valore a zero.

Revisioni informali del design - prima della codifica - nessuna pressione - nessuna documentazione - consente una migliore discussione su come vengono assegnate le responsabilità e su come gli oggetti collaboreranno.

    
risposta data 28.07.2011 - 13:42
fonte
4

Suppongo che tu sia più giovane di alcuni sviluppatori, ma più in alto nella catena alimentare.

A rischio di essere burried in downvotes, potrebbe essere che gli "ingegneri esperti" stiano di fatto facendo la cosa giusta - o poiché si tratta di un prodotto maturo che potrebbe essere stato in giro per decenni, quello che una volta era la cosa giusta .

Il codice precedente tende ad essere ottimizzato per funzionare rapidamente sull'hardware del tempo; tra l'altro questo significa ridurre i livelli di ereditarietà ed evitare chiamate di funzioni / metodi per operazioni banali.

I compilatori sono diventati molto più intelligenti nel corso degli anni, quindi non tutto ciò che era vero una volta adesso è - per esempio, un compilatore può scegliere di incorporare una piccola funzione.

Forse una via da seguire sarebbe adottare un approccio diverso - chiedere agli sviluppatori di spiegare come / perché il loro metodo è migliore della teoria che ti è stata insegnata - ed essere sincero al riguardo.

    
risposta data 10.03.2016 - 15:02
fonte
0

Spingere per i test unitari con una copertura del 100% di ogni nuovo / modificato metodo non porta a minimizzare l'accoppiamento tra i metodi.

    
risposta data 28.07.2011 - 11:35
fonte
0

Potresti voler prendere il libro "Design Patterns" dalla Gang of Four. Non è specifico del C ++, quindi non stai criticando apertamente la tua conoscenza del C ++ dei tuoi colleghi quando ti riferisci ad esso. Eppure allo stesso tempo affronta argomenti che consideri rilevanti. Inoltre, il libro è ampiamente accettato come rilevante, quindi non possono facilmente liquidarlo come teorico o poco pratico.

D'altra parte, considera che il C ++ non è un linguaggio OO puro, né nel design né nella pratica. Tutta la storia del costruttore / memset suona dovresti introdurre RAII, che non è affatto una tecnica OO ma specifica del C ++ (sfortunatamente -. IDispose di .Net mostra cosa succede quando RAII è un ripensamento). I libri rilevanti qui sono (Altro) Efficace C ++ e (Altro) Eccezionale C ++.

    
risposta data 28.07.2011 - 11:51
fonte

Leggi altre domande sui tag