Forse è il mio background di scripting, ma la mia prospettiva è che lo scopo di un oggetto dovrebbe essere quello di contenere i dati. Le classi sono necessarie in quanto forniscono modelli e metodi standard per classificare e costruire oggetti con particolari attributi di dati. Il protocollo standard nella progettazione orientata agli oggetti sembra includere la logica di business nelle definizioni di classe.
In un sistema che dipende dallo stato, comprendo la motivazione alla base dei metodi di associazione con il solo scopo di alterare o recuperare lo stato di un oggetto alla definizione della classe. Quindi escludiamo semplici getter, setter e costruttori dall'ambito della conversazione.
I problemi, come li vedo, iniziano quando processi sono associati a un oggetto.
Considera un semplice metodo "string.equals ()" che accetta una stringa come parametro e restituisce un valore booleano che indica se le stringhe sono equivalenti. Penso che questo semplice metodo possa causare enormi problemi.
Diciamo che ho una classe LocationString ereditata da String, dove equals () è sovrascritto come segue:
Boolean equals(LocationString otherLocation) {
return extractCountry().equals(otherLocation.extractCountry());
}
String extractCountry(){
return this.getCountry();
}
Ora, supponiamo di avere un migliaio di oggetti così diversi con diverse definizioni di equals (), alcuni dei quali sono gli stessi, e alcuni dei quali sono molto diversi. All'improvviso, la definizione di uguaglianza cambia per alcune delle mie classi. Diventa estremamente doloroso capire che le definizioni uguali devono essere cambiate. Diventa doloroso capire se altri processi interni che hanno chiamato il metodo degli uguali devono essere cambiati. Alla fine, man mano che il sistema si espande, più ore vengono sprecate cercando nel codice piuttosto che analizzarlo.
In quanto tale, per me ha molto più senso definire una regola generica uguale che modifica il suo comportamento in modo polimorfico a seconda degli input che riceve. Considera la seguente definizione:
public static Boolean equals(Object a, Object b) {
List locationClasses = Arrays.asList("LocationString")
if (locationClasses.contains(a.getClass().getName()) && locationClasses.contains(b.getClass().getName()){
return equals(a.extractCountry(), b.extractCountry());
}
else {
return StringUtils.equals(a,b);
}
}
Se tutti i processi fossero definiti esternamente, un cambiamento di processo non sarebbe tanto difficile da correggere e, a condizione che queste regole più generiche potessero essere archiviate e classificate logicamente, sarebbero facili da trovare e sarebbe necessario cambiare solo una volta modifiche della logica di business.
Questo approccio sembra relativamente semplice e diretto. Perché allora, è stato generalmente respinto a favore del tipico accoppiamento orientato agli oggetti dei dati con i metodi?