Riscrivi della domanda : esiste una ragione tecnica per cui non stiamo utilizzando metodi statici invece dei metodi di istanza.
I motivi tecnici sono ad esempio: prestazioni o sicurezza del tipo aggiunto.
Ritengo che con metodi statici e solo classi di dati puri si ottenga una sicurezza di tipo migliore e un codice più gestibile.
Perché aggiungiamo metodi alle classi?
Quando guardo cosa fa il compilatore, possiamo dedurre che un metodo di istanza su una classe viene trasformato in:
public static class Foo {
public static int Something(object this) { ... }
}
Questo ci mostra che anche "sotto il cofano" passiamo semplicemente i dati come parametro ai nostri metodi o, più precisamente, alle funzioni.
Qual è il ragionamento alla base dei metodi di istanza?
La mia ricerca ha rilevato tre motivi principali per l'aggiunta di metodi di istanza:
- Convenzione, ci è stato insegnato a farlo in questo modo
- Ignoranza, non sappiamo in un altro modo
- Convenienza, funzionalità più semplice da trovare, fondamentalmente un modo per raggruppare le funzionalità.
Trovo tutte e tre le ragioni traballanti al meglio. Penso che tutti possiamo essere d'accordo sul fatto che i primi due motivi non sono motivi validi, questo ci lascia con la terza ragione, Convenience , ma quando si guarda il codice chiamante di un metodo di istanza si vede qualcosa di strano accadere:
var o = new MyClass(..some parameters...);
o.Something(...some parameters...);
Abbiamo diviso la nostra firma di funzione su due righe. In pratica, abbiamo perso la possibilità di verificare realmente le modifiche apportate al nostro sistema. E il confronto con qualcosa come currying non è un paragone valido. Usare le classi per esprimere dati e utilizzare le funzioni (classi statiche con metodi statici) non sarebbe un modo migliore e ancora più conveniente per raggruppare i dati?
Potremmo riscrivere il precedente codice chiamante in:
StaticLib.Something(...some parameters...);
E sii appena fatto. Usare il codice sarebbe più facile da testare e implementare e anche il raggruppamento del codice è facile. Usa semplicemente i criteri di segmentazione di base sulla tua collezione di funzioni. Puoi persino automatizzare questo raggruppamento quando prendi in considerazione tipi e firme ...
EDIT: Come affermato da @Daniel T. Mi sembra che stia venendo giù per convenzione. Questo non è quello che voglio trasmettere. La Convention è eccezionale quando si lavora in un grande progetto o si lavora con colleghi. La convenzione è anche un ottimo modo per cambiare bottiglia, per favore leggi questa prossima modifica non come un attacco alla convenzione nei progetti ma come un attacco alla convenzione come argomento per il ragionamento.
EDIT: Non sto parlando di OOP vs FP, dovremmo essere tutti d'accordo sul fatto che le soluzioni poliglotta siano le migliori. Non sono interessato a risposte come:
- La maggior parte dei programmatori si aspetta che il loro codice assomiglia ....
- È una convenzione
- Mi è stato insegnato a farlo in quel modo ...
Quelle sono risposte basate su convenzioni e dogmi e non daranno mai modi migliori di pensare o codificare.
Sono interessato alle prove e al solido ragionamento. La risposta accettata nel cosiddetto duplicato riduce la domanda a due cose:
- Non sente OO abbastanza
- Non mi piace
Questa non è una prova e non è una risposta alla domanda. Inoltre non faccio la stessa domanda quindi è dubbio che sia un duplicato.
EDIT: non è un duplicato . Non sono interessato all'eredità o ad altri aspetti OOP. Quasi la qualità e la leggibilità del codice.