"Troppo orientato agli oggetti"


21

Vengo da un forte background OO e recentemente ho iniziato a lavorare in un'organizzazione che, sebbene il codice sia scritto in Java, ha molta meno enfasi sul buon design OO rispetto a quello a cui sono abituato. Mi è stato detto che presento "troppa astrazione" e che dovrei invece codificare come è sempre stato fatto, che è uno stile procedurale in Java.

TDD non è anche molto praticato qui, ma voglio avere un codice verificabile. Seppellire la logica aziendale in metodi statici privati ​​in grandi "classi di Dio" (che sembra essere la norma per questa squadra) non è molto verificabile.

Faccio fatica a comunicare chiaramente la mia motivazione ai miei collaboratori. Qualcuno ha qualche consiglio su come posso convincere i miei colleghi che l'uso di OO e TDD porta a un codice più facilmente gestibile?

Questa domanda sul debito tecnico è collegata alla mia domanda. Tuttavia, sto cercando di evitare di incorrere in primo luogo nel debito, invece di ripagarlo dopo il fatto che è quello che copre l'altra domanda.


17
Qual è il tuo ruolo? Sviluppatore Grunt? Sei fregato: trova un lavoro migliore. Capo sviluppatore? Potresti fare la differenza ...
Matthew Flynn,

2
Non tanto debito tecnologico, quanto gestire design scadente e persone che non cambieranno
ozz

1
Sono consapevole delle argomentazioni tecniche e commerciali, chiedo come comunicare al meglio queste conoscenze ai miei colleghi che sembrano non accorgersene. Vedono molte classi, vedo un sistema testabile ed estensibile
ThuneGrill

5
Scusa, devi andartene. Stai parlando al di sopra dei tuoi colleghi. Non cambierà fino a quando il progetto non diventerà non realizzabile. Se non ti piacciono i test manuali e la marcia della morte, è meglio che tu vada altrove.
Kevin Cline,

4
Senza vedere il codice in questione (sì, è difficile fornire un campione abbastanza buono, quindi dobbiamo solo fidarci del tuo giudizio qui), è difficile dire se c'è davvero mancanza di OO, o se stai spingendo un cult-cargo troppo ingegnerizzato Astrazioni OO senza una buona ragione. Penso che tutti abbiano visto esempi di OOP troppo ingegnerizzati, in cui le astrazioni poggiano su uno strato di fabbriche astratte che producono fabbriche astratte, ecc.
Kromster afferma di sostenere Monica il

Risposte:


32

Non ti sei lamentato del fatto che non è possibile mantenerlo, ma non di tuo gradimento. Se si tratta di una scelta di stile deliberata, potrebbe trattarsi solo di differenze creative inconciliabili e dovresti adattare il tuo stile per adattarlo o trovare un posto adatto al tuo stile preferito.

Le persone possono e devono sempre scrivere codice modulare, efficiente, ben astratto, relativamente privo di bug in uno stile procedurale. Java è una strana scelta di linguaggio per un tale negozio, ma posso vederlo accadere se fattori esterni decidessero la lingua, come ad esempio la necessità di sviluppare per Android.

Tutti sono un genio. Ma se giudichi un pesce dalla sua capacità di arrampicarsi su un albero, vivrà tutta la sua vita credendo che sia stupido. - Albert Einstein

Se stata una scelta deliberata, non puoi davvero giudicarli dal modo in cui aderiscono ai buoni principi di progettazione orientati agli oggetti, dovresti giudicare da quanto bene aderiscono ai buoni principi di progettazione procedurale e anche riformattare di conseguenza. Java non ti consente di scrivere codice al di fuori di una classe, quindi la semplice presenza di uno non significa che intendessero un modulo orientato agli oggetti.

D'altra parte, se il codice è un disastro in entrambi i paradigmi, probabilmente dovresti semplicemente tagliare le tue perdite.


3
è procedurale e disordinato. Ma sto parlando di un nuovo codice che scrivo chiamato "troppo orientato agli oggetti"
ThuneGrill

5
estendere il codice procedurale disordinato con il codice OO potrebbe non essere un miglioramento, aggiungendo solo confusione.
Wirrbel,

7
@ThuneGrill, stai supponendo che abbiano scelto il loro stile di codifica per ignoranza del design orientato agli oggetti, che se solo potessi educarli, vedrebbero la luce. Se una persona con un'attività di software redditizia in un linguaggio fortemente orientato agli oggetti non ha ancora esaminato i vantaggi di OOD, non c'è modo che il "nuovo ragazzo" lo convincerà. Prendi la mia parola e la parola di altri commentatori. Se non riesci o non modifichi il tuo stile per facilitare la lettura della squadra, dovresti ridurre le perdite.
Karl Bielefeldt,

3
@ThuneGrill: Karl ha ragione. Attenersi a ragioni pragmatiche, non religiose. OOP è sicuramente una buona idea, ma l'ho vista portata a livelli ridicoli. Il risultato è rendere le montagne fuori dai molehills. Le cose che potrebbero essere fatte in 1000 righe di codice finiscono per essere 10.000 righe di codice con classi in abbondanza. Quindi, Accidenti, è difficile da mantenere e le prestazioni fanno schifo. (Indipendentemente dalle classi di raccolta utilizzate.)
Mike Dunlavey,

1
Non mi arrenderei necessariamente all'idea che puoi convincere la gente su questo. È difficile, ma può essere fatto - l'ho fatto. Poiché questa domanda sembra chiusa, vedi workplace.stackexchange.com/questions/9703/…
Amy Blankenship

7

Leggendo la tua domanda, mi sono ricordato di un consiglio del libro Pragmatic Programmer.

Uno dei suoi suggerimenti è Be a Catalyst for Change:

Potresti trovarti in una situazione in cui sai esattamente cosa deve fare e come farlo. L'intero sistema appare appena sotto i tuoi occhi: sai che è giusto. Ma chiedi il permesso per affrontare tutto e ti ritroverai con ritardi e sguardi vuoti. Le persone formeranno commissioni, i budget dovranno essere approvati e le cose si complicheranno. Ognuno custodirà le proprie risorse. A volte questo si chiama "stanchezza all'avvio".

È ora di cucinare Stone Soup. Scopri cosa puoi ragionevolmente chiedere. Sviluppalo bene. Una volta che lo hai, mostra alla gente e lasciali meravigliare. Quindi dì "certo, sarebbe meglio se aggiungessimo ..." Fingere che non sia importante. Siediti e attendi che inizino a chiederti di aggiungere la funzionalità che originariamente volevi. Le persone trovano più facile unirsi a un successo continuo. Mostra loro un assaggio del futuro e li farai radunare.

Quindi, penso che se inizi a fare un buon lavoro con le tue conoscenze OO e TDD, presto inizieranno a cercare e chiedere del tuo lavoro.


Cercando di esserlo, ma l'Uber-Architect (che non codifica) non ne avrà nulla.
ThuneGrill

Non appena noterà i vantaggi di TDD e una migliore OO (affidabilità, produttività, ...), attirerai la tua attenzione!
Rodrigo

3

Per vendere nuovi modi di lavorare, devi mostrare evidenti vantaggi. Scrivere più livelli di astrazione, senza un chiaro vantaggio ma un vago: "può essere utile per il futuro" non funzionerà.

Crea fabbriche in cui le fabbriche producono più di un tipo di oggetto. Usa l'iniezione delle dipendenze, dove mostra immediatamente i benefici. Crea interfacce che verranno implementate da più di una classe.

Quello che vedo troppo spesso in "OO vero" è che vengono utilizzate tecniche avanzate per risolvere problemi davvero semplici in un modo troppo complesso.

Come si può dimostrare il vantaggio di una fabbrica se solo lo sarà mai lo stesso oggetto? Trova un problema nel tuo codice che beneficia di tecniche avanzate e mostra il tuo punto e il lavoro da lì.

Le guerre si vincono una battaglia alla volta.


1

Puoi convincerli solo assumendo un piccolo pezzo di codice e implementando TDD e migliori pratiche OO su di esso per realizzare i vantaggi. Li hai portati nella terra promessa, non solo mostrandoti delle belle cartoline postali.

Certamente, penso che oggi ci siano casi di sovraastrazione in uso in molte basi di codice. Inserisci solo ciò di cui hai bisogno e questo include anche le astrazioni.


1
Appena fatto, questo è ciò che ha causato l'intera discussione. Ho introdotto solo 3-4 astrazioni oltre alla funzionalità esistente
ThuneGrill
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.