Gli oggetti consegnati in termini di riutilizzo del codice?


17

Ho sentito spesso dire che gli oggetti non sono stati consegnati in termini di riutilizzo del codice. Sei d'accordo? Se ritieni di non averlo fatto, perché no?


4
Non ho mai sentito nessuno dire che ...
TheLQ,

2
@la non credo di aver sentito qualcuno dirlo, ma l'ho letto.
George Marian,

La riutilizzabilità non è l'unico vantaggio di OOP.
Nessuno il

2
"Gli oggetti consegnati in termini di riutilizzo del codice?" -> Solo se credevi ai venditori OOP di quel tempo (erano gli anni '60? Me lo dimentico)
Steven Evers,

La mia risposta a una domanda simile: programmers.stackexchange.com/questions/53521/…
kevin cline,

Risposte:


18

No, non necessariamente.

Gli oggetti offrono una migliore semantica, organizzazione del codice / funzionalità e, possibilmente, facilità d'uso.

Le librerie ben progettate promettono il riutilizzo del codice, non gli oggetti in sé.


Beh si. Ma gli oggetti hanno aiutato i progettisti di biblioteche fornendo loro opzioni che facilitano il riutilizzo delle loro biblioteche? Direi che hanno, e quindi gli oggetti hanno prodotto un riutilizzo migliorato.
Jules l'

@Jules Anche a me piace discutere solo per il dibattito. Non direi che gli oggetti non abbiano semplificato la progettazione delle librerie. Sto sostenendo che l'uso corretto dei tuoi strumenti è ciò che porta a risultati corretti.
George Marian,

7

Sinceramente non sono sicuro che il "riutilizzo del codice" sia realmente ciò che qualcuno sta cercando (o almeno dovrebbe essere dopo). La mia filosofia è "componenti software", che significa migliore manutenibilità attraverso buone interfacce ed evitando inutili accoppiamenti. Il "riutilizzo del codice" è una delle cose che a volte sfugge a questo: il codice inutilmente duplicato è un segno del fatto che hai organizzato le cose nel modo sbagliato e, naturalmente, è un dolore da mantenere.

Per rispondere alla domanda un po 'più direttamente, c'è una raccolta di strumenti abbastanza buoni per evitare di ripetersi: eredità, tratti, delega, funzioni di ordine superiore, ecc. Di questi, le persone tendono a confondere l'eredità con OO nel suo insieme - e tendono anche a usarlo un po ', se me lo chiedi. Forse è da lì che parte l'atmosfera "OO succhia": trovare l'eredità bloccata dove non ha il diritto naturale di essere :)


Il riutilizzo del codice è sicuramente qualcosa su cui puntare, quando puoi evitare di sacrificare la qualità del codice
Casebash,

1
Il riutilizzo del codice, tuttavia, non è un obiettivo in sé. Riutilizzo è un'altra parola per l'accoppiamento. Pertanto, è necessario avvicinarsi con attenzione al riutilizzo. Sembra che molti sviluppatori lo dimentichino. Vogliono sistemi disaccoppiati, ma si voltano e cercano di usare una classe esistente ovunque.
Andy,

5

No, gli "oggetti" non hanno reso il riutilizzo del codice più semplice o più comune. Le stesse preoccupazioni che impediscono il riutilizzo del codice in un programma modulare (la progettazione, il test e la documentazione di un'API per scopi generici richiede uno sforzo notevolmente maggiore rispetto alla scrittura di una routine una tantum, e il vantaggio di tutte le operazioni può essere il master of none - la logica destinata a essere riutilizzata potrebbe non essere ben ottimizzata per gli usi per i quali è effettivamente utilizzata) si applica ai programmi OO, con l'ulteriore preoccupazione che un modello a oggetti mal progettato può ostacolare il riutilizzo di riutilizzabili altrimenti codice.

OO è una pratica astrazione per molti problemi, ma fai attenzione alla campagna pubblicitaria degli anni '80 -'90: non risolve magicamente i problemi fondamentali del nostro commercio più di quanto ti crei cialde mentre dormi.


5

Non mi aspetto che TUTTI gli oggetti vengano riutilizzati, ma abbiamo molti oggetti che riutilizziamo in molti progetti diversi. Abbiamo anche oggetti che vengono riutilizzati in un solo progetto. Consumeremo spesso gli stessi oggetti business (o oggetti di trasferimento dati) e oggetti di business logic da un'app desktop Click-Once, un'app Web e un'app telefonica tutte per lo stesso progetto.

Dove hai sentito che OO non consegna al riutilizzo? E qual era il ragionamento? Forse il design dei loro oggetti li ha costretti a quella situazione ...


4
Articoli vari. E per esperienza personale, rendere riutilizzabile un oggetto non è affatto facile
Casebash,

3

Alcuni programmatori copieranno e incolleranno in qualsiasi lingua e stile.

I programmatori davvero bravi possono evitare la maggior parte delle operazioni di copia e incolla in quasi tutte le lingue.

Trovo che i modelli OO tendano a incoraggiare il riutilizzo. Ho visto codice Java scritto in uno stile non OO (in cui i dati sono stati separati dal codice a causa di ORM scadente) e il riutilizzo è stato davvero miserabile - ma in OO gli stessi programmatori hanno fatto un lavoro migliore in fase di progettazione ( e riutilizzare).

Anche nei casi in cui utilizziamo modelli non oo o anti-patter come setter / getter, istruzioni switch, classi interne anonime, funzioni enormi e simili, ho visto il riutilizzo del codice andare giù e il boilerplate salire ... in modo significativo.

ps. So che le persone avranno problemi con il paragrafo precedente, quindi spiegherò un po '.

I setter e i getter causano problemi OO perché ti permettono di operare sui membri di un oggetto (un oggetto dovrebbe manipolarne i membri PROPRI) Questo distribuisce il codice che opera sulla tua classe in altre classi che richiedono di copiare la funzionalità attorno al setter / getter . Questo vale anche per le Proprietà - solo perché le Proprietà sono più facili non le rende "buone" in tutte le situazioni.

Il codice nelle classi interne anonime non può essere riutilizzato affatto e la gente dimentica che molte cose (come gli ascoltatori) possono e dovrebbero essere classi a tutti gli effetti - questo vale anche per le chiusure! Se hai usato una classe interna anonima per implementare qualcosa come un ascoltatore, hai molte più probabilità di copiare e incollare l'implementazione piuttosto che estrarre il codice in un metodo o la sua classe e chiamarlo invece. Le chiusure possono anche migliorare la riusabilità - dipende solo da come le usi.

In molti casi le funzionalità disponibili modellano il modo in cui strutturi il codice. OO è ancora più potente quando si tratta di aiutarti a visualizzare tutto il codice e come interagisce, ma questa è un'altra domanda.


2

Gli oggetti non hanno più la capacità di fornire il riutilizzo del codice di quanto un montascale o altre attrezzature per il fitness possano portare alla perdita di peso. Gli sviluppatori devono essere motivati ​​a utilizzare correttamente gli strumenti.

Una volta che i team di software attribuiscono un valore maggiore al riutilizzo del codice testato rispetto a quando mantengono tutti i dettagli nella loro testa, vedrai oggetti e metodi molto più dettagliati e quindi un maggiore riutilizzo del codice.


2

OOP ti offre più modi per riutilizzare il codice

No

non c'è proiettile d'argento

Dipende

su cosa ci hai messo e cosa ti aspettavi in ​​cambio!


1

Sì. Una buona programmazione orientata agli oggetti promuove la separazione delle preoccupazioni, il basso accoppiamento, l'alta coesione e il nascondimento delle informazioni. Queste cose sono tutte fondamentali per il codice riutilizzabile.

Direi che il vantaggio principale di OOP è la modularità e la modificabilità, piuttosto che il riutilizzo, ma questa è un'altra domanda.


4
Concordo sul fatto che gli oggetti rendono il codice più gradevole, ma sfortunatamente una parte così grande dei miei oggetti non è riutilizzabile. Fare spesso un oggetto riutilizzabile significa spesso semplificare
eccessivamente

2
@casebase +1 Tuttavia, direi che rendere riutilizzabili gli oggetti significa complicare la situazione (oggetto).
George Marian,

Non tutto sarà riutilizzabile. La maggior parte delle cose no. Tuttavia, basso accoppiamento, occultamento delle informazioni, ecc. Sono tutti prerequisiti per il riutilizzo e l'oggetto lo promuove.
Fishtoaster,

2
@Fishtoaster: potresti anche dire che la tua auto in movimento è un prerequisito per andare al lavoro, e un vialetto inclinato lo promuove. È tecnicamente vero, ma è improbabile che faccia la differenza al di fuori dei casi limite: se hai bisogno e vuoi riutilizzarlo, lo otterrai, OO o no; in caso contrario, avere i prerequisiti non accadrà accidentalmente.
Shog9

@Sig. C- Non sono sicuro di seguire il tuo punto. Stavo semplicemente affermando che le cose promosse da OOP (modularità, ecc.) Rendono più semplice creare cose come le biblioteche. Esistono molti modi per rendere riutilizzabile il codice separando le preoccupazioni, ecc. OOP è uno, un buon metodo di progettazione è un altro, la corretta decomposizione dei problemi è ancora un altro.
Fishtoaster,

1

Gli oggetti abilitano il ricorso al codice, ma in quanto tale non è la tecnica più adatta. Penso che il riutilizzo del codice sia promosso attraverso tecniche relative agli oggetti come ereditarietà, polimorfismo, sovraccarico e modelli.


1

Sì, lo fanno, la capacità di estendere (ereditare) da una super classe chiaramente contribuisce al riutilizzo del codice, non sono sicuro di come si possa discutere diversamente. Puoi semplicemente estendere una classe e sovrascrivere un metodo, mentre usi il resto dalla super classe, se questo non aiuta il riutilizzo del codice, allora non so cosa sia


0

Se lo è, hanno mantenuto la promessa di riutilizzare il codice finora? Sì, se i programmi scritti pensando a OOP applicano saggiamente i modelli di progettazione. Altrimenti, per lo più no. Ma osservando la popolarità di programmi non banali su larga scala che sistemi Adobe, Google e simili scrivono con C ++ o Java o altri linguaggi OOP, direi che OOP ha ancora molta strada da fare prima che venga eliminata. Quel tempo sarà molto più adatto a porre questa domanda e potrebbe aiutare a fornire lavoro di base per un nuovo paradigma.

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.