Ich habe in verschiedenen Projekten etwas in meinem Code bemerkt, das mir nach Code riecht und etwas Schlechtes zu tun ist, aber ich kann damit nicht umgehen.
Beim Versuch, "sauberen Code" zu schreiben, neige ich dazu, private Methoden zu häufig zu verwenden, um das Lesen meines Codes zu erleichtern. Das Problem ist, dass der Code zwar sauberer ist, aber auch schwieriger zu testen ist (ja, ich weiß, dass ich private Methoden testen kann ...), und im Allgemeinen scheint es mir eine schlechte Angewohnheit zu sein.
Hier ist ein Beispiel für eine Klasse, die einige Daten aus einer CSV-Datei liest und eine Gruppe von Kunden zurückgibt (ein anderes Objekt mit verschiedenen Feldern und Attributen).
public class GroupOfCustomersImporter {
//... Call fields ....
public GroupOfCustomersImporter(String filePath) {
this.filePath = filePath;
customers = new HashSet<Customer>();
createCSVReader();
read();
constructTTRP_Instance();
}
private void createCSVReader() {
//....
}
private void read() {
//.... Reades the file and initializes the class attributes
}
private void readFirstLine(String[] inputLine) {
//.... Method used by the read() method
}
private void readSecondLine(String[] inputLine) {
//.... Method used by the read() method
}
private void readCustomerLine(String[] inputLine) {
//.... Method used by the read() method
}
private void constructGroupOfCustomers() {
//this.groupOfCustomers = new GroupOfCustomers(**attributes of the class**);
}
public GroupOfCustomers getConstructedGroupOfCustomers() {
return this.GroupOfCustomers;
}
}
Wie Sie sehen, verfügt die Klasse nur über einen Konstruktor, der einige private Methoden aufruft, um die Aufgabe zu erledigen. Ich weiß, dass dies im Allgemeinen keine gute Vorgehensweise ist, aber ich ziehe es vor, alle Funktionen in der Klasse zu kapseln, anstatt die Methoden in diesem Fall öffentlich zu machen Ein Kunde sollte folgendermaßen arbeiten:
GroupOfCustomersImporter importer = new GroupOfCustomersImporter(filepath)
importer.createCSVReader();
read();
GroupOfCustomer group = constructGoupOfCustomerInstance();
Ich bevorzuge dies, weil ich keine nutzlosen Codezeilen in den Seitencode des Clients einfügen möchte, die die Clientklasse mit Implementierungsdetails belästigen.
Also, ist das eigentlich eine schlechte Angewohnheit? Wenn ja, wie kann ich das vermeiden? Bitte beachten Sie, dass dies nur ein einfaches Beispiel ist. Stellen Sie sich die gleiche Situation in etwas Komplexerem vor.