"Zu objektorientiert"

21

Ich habe einen starken OO-Hintergrund und arbeite seit kurzem in einer Organisation, die, obwohl der Code in Java geschrieben ist, viel weniger Wert auf gutes OO-Design legt als ich es gewohnt bin. Mir wurde gesagt, dass ich "zu viel Abstraktion" einführe, und dass ich stattdessen die Art und Weise codieren sollte, wie es immer gemacht wurde, was in Java ein prozeduraler Stil ist.

TDD wird hier auch nicht sehr geübt, aber ich möchte testbaren Code haben. Das Vergraben von Geschäftslogik in statischen privaten Methoden in großen "Gottklassen" (was für dieses Team die Norm zu sein scheint) ist nicht sehr prüfbar.

Ich bemühe mich, meinen Mitarbeitern meine Motivation klar mitzuteilen. Hat jemand einen Rat, wie ich meine Kollegen davon überzeugen kann, dass die Verwendung von OO und TDD zu einfacherem Code führt?

Diese Frage zur technischen Verschuldung hängt mit meiner Frage zusammen. Ich versuche jedoch zu vermeiden, dass die Schulden anfallen , anstatt sie nachträglich zu begleichen, worum es in der anderen Frage geht.

ThuneGrill
quelle
17
Was ist deine Rolle? Grunzen Entwickler? Du bist beschissen - mach einen besseren Job. Leitender Entwickler? Möglicherweise können Sie einen Unterschied machen ...
Matthew Flynn
2
Nicht so viel technische Schulden, wie der Umgang mit schlechtem Design und Menschen, die sich nicht ändern
ozz
1
Ich bin mir der technischen und geschäftlichen Argumente bewusst und frage, wie ich dieses Wissen am besten meinen Mitarbeitern vermitteln kann, die dies nicht zu bemerken scheinen. Sie sehen viele Klassen, ich sehe ein testbares, erweiterbares System
ThuneGrill
5
Entschuldigung, du musst gehen. Sie sprechen über die Köpfe Ihrer Kollegen. Es wird sich nicht ändern, bis das Projekt nicht mehr erreichbar ist. Wenn Sie manuelle Tests und Todesmärsche nicht mögen, gehen Sie besser woanders hin.
Kevin Cline
4
Ohne den fraglichen Code zu sehen (ja, es ist schwierig, ausreichend gute Beispiele zur Verfügung zu stellen, daher müssen wir hier nur Ihrem Urteil vertrauen), ist es schwierig zu sagen, ob tatsächlich ein Mangel an OO vorliegt oder ob Sie einen überentwickelten Frachtkult forcieren OO Abtraktionen ohne guten Grund. Ich denke , jedes Beispiel für over-engineered OOP gesehen hat, wo Abstraktionen auf Ebene der abstrakten Fabriken zur Herstellung von abstrakten Fabriken ruhen usw.
Kromster sagt Unterstützung Monica

Antworten:

32

Sie haben sich nicht darüber beschwert, dass es nicht zu halten ist, nur nicht nach Ihrem Geschmack. Wenn es sich um eine bewusste Stilwahl handelt, kann es sich nur um unüberbrückbare kreative Unterschiede handeln, und Sie sollten Ihren Stil anpassen oder einen Ort finden, der zu Ihrem bevorzugten Stil passt.

Die Leute können und tun es, indem sie ständig modularen, effizienten, gut abstrahierten und relativ fehlerfreien Code in einem prozeduralen Stil schreiben. Java ist eine seltsame Wahl der Sprache für einen solchen Shop, aber ich kann sehen, dass es passiert, wenn externe Faktoren die Sprache bestimmen, wie zum Beispiel die Notwendigkeit, für Android zu entwickeln.

Jeder ist ein Genie. Aber wenn Sie einen Fisch nach seiner Fähigkeit beurteilen, auf einen Baum zu klettern, wird er sein ganzes Leben lang im Glauben leben, dass er dumm ist. - Albert Einstein

Wenn es war eine bewusste Entscheidung, nicht wirklich sie durch das beurteilen kann , wie gut haften sie für eine gute objektorientierte Design - Prinzipien, sollten Sie durch beurteilen , wie gut haften sie für eine gute Verfahrenskonstruktionsprinzipien und refactor dementsprechend auch. Mit Java können Sie keinen Code außerhalb einer Klasse schreiben. Das bloße Vorhandensein eines Codes bedeutet also nicht, dass ein Modul objektorientiert sein soll.

Auf der anderen Seite, wenn der Code in einem der Paradigmen ein Chaos ist , sollten Sie wahrscheinlich nur Ihre Verluste reduzieren.

Karl Bielefeldt
quelle
3
es ist prozedural und chaotisch. Aber ich spreche von neuem Code, den ich als "zu objektorientiert" schreibe
ThuneGrill
5
unordentlicher prozeduraler Code, der mit OO-Code erweitert wird, ist möglicherweise keine Verbesserung, sondern sorgt nur für Verwirrung.
Wirrbel
7
@ThuneGrill, Sie gehen davon aus, dass sie ihren Codierungsstil aus Unkenntnis des objektorientierten Designs gewählt haben. Wenn Sie sie nur erziehen könnten, würden sie das Licht sehen. Wenn jemand mit einem profitablen Softwaregeschäft in einer stark objektorientierten Sprache die Vorteile von OOD noch nicht untersucht hat, kann ihn der "Neue" auf keinen Fall überzeugen. Nehmen Sie mein Wort dafür und das Wort anderer Kommentatoren. Wenn Sie Ihren Stil nicht anpassen können oder wollen, um dem Team das Lesen zu erleichtern, sollten Sie Ihre Verluste reduzieren.
Karl Bielefeldt
3
@ ThuneGrill: Karl hat recht. Halten Sie sich an pragmatische Gründe, nicht an religiöse. OOP ist sicherlich eine gute Idee, aber ich habe gesehen, dass es zu lächerlichen Extremen geführt hat. Das Ergebnis ist, dass aus Maulwurfshügeln Berge werden. Dinge, die in 1000 Codezeilen gemacht werden könnten, sind am Ende 10.000 Codezeilen mit Klassen in Hülle und Fülle. Dann, Gee, ist es schwer zu warten und die Leistung ist schlecht. (Egal welche Sammelklassen verwendet werden.)
Mike Dunlavey
1
Ich würde nicht unbedingt auf die Idee verzichten, dass man die Leute davon überzeugen kann. Es ist hart, aber es kann getan werden - ich habe es getan. Da diese Frage geschlossen zu sein scheint, siehe arbeitsplatz.stackexchange.com/questions/9703/…
Amy Blankenship
7

Als ich Ihre Frage las, fiel mir ein Tipp aus dem Buch Pragmatic Programmer ein.

Einer seiner Tipps ist Be a Catalyst for Change:

Sie befinden sich möglicherweise in einer Situation, in der Sie genau wissen, was zu tun ist und wie dies zu tun ist. Das gesamte System erscheint nur vor Ihren Augen - Sie wissen, dass es richtig ist. Aber bitte um Erlaubnis, das Ganze in Angriff zu nehmen, und du wirst mit Verzögerungen und leeren Blicken konfrontiert. Die Leute werden Komitees bilden, die Budgets müssen genehmigt werden und die Dinge werden kompliziert. Jeder wird seine eigenen Ressourcen schützen. Manchmal wird dies als "Startermüdung" bezeichnet.

Es ist Zeit, Steinsuppe zu kochen. Finde heraus, wonach du vernünftigerweise fragen kannst. Entwickle es gut. Zeigen Sie es den Leuten und lassen Sie sie staunen. Dann sagen Sie: "Natürlich wäre es besser, wenn wir hinzufügen ..." Tu so, als sei es nicht wichtig. Lehnen Sie sich zurück und warten Sie, bis Sie aufgefordert werden, die ursprünglich gewünschte Funktionalität hinzuzufügen. Die Menschen finden es einfacher, an einem anhaltenden Erfolg teilzunehmen. Zeigen Sie ihnen einen Blick in die Zukunft und Sie werden sie dazu bringen, sich zu sammeln.

Also, ich denke, wenn du mit deinen OO- und TDD-Kenntnissen anfängst, gute Arbeit zu leisten, werden sie bald anfangen, nach deinem Job zu suchen und zu fragen.

Rodrigo
quelle
Versucht zu sein, aber der Überarchitekt (der nicht codiert) wird nichts davon haben.
ThuneGrill
Sobald er die Vorteile von TDD und einer besseren OO (Zuverlässigkeit, Produktivität, ...) bemerkt, werden Sie Ihre Aufmerksamkeit auf sich ziehen!
Rodrigo
3

Um neue Arbeitsweisen zu verkaufen, müssen Sie offensichtliche Vorteile zeigen. Mehr Abstraktionsebenen zu schreiben, ohne einen klaren, aber vagen Vorteil: "Es kann vorteilhaft für die Zukunft sein", wird nicht funktionieren.

Stellen Sie Fabriken her, in denen die Fabriken mehr als einen Objekttyp herstellen. Verwenden Sie die Abhängigkeitsinjektion, bei der die Vorteile sofort sichtbar werden. Erstellen Sie Schnittstellen, die tatsächlich von mehr als einer Klasse implementiert werden sollen.

Was ich in "true OO" zu oft sehe, ist, dass fortgeschrittene Techniken verwendet werden, um wirklich einfache Probleme auf übermäßig komplexe Weise zu lösen.

Wie können Sie den Nutzen einer Fabrik zeigen, wenn sie immer nur dasselbe Objekt herstellen wird? Finden Sie ein Problem in Ihrem Code, das von fortschrittlichen Techniken profitiert, und zeigen Sie Ihren Standpunkt und arbeiten Sie von dort aus.

Kriege werden nacheinander gewonnen.

Pieter B
quelle
1

Sie können sie nur überzeugen, indem Sie einen kleinen Teil des Codes übernehmen und TDD und bessere OO-Methoden implementieren, um die Vorteile zu nutzen. Sie haben sie in das gelobte Land geführt, nicht nur schöne Postkarten davon.

Ich denke, es gibt Fälle von Überabstraktion, die heutzutage in vielen Codebasen verwendet werden. Geben Sie nur das ein, was Sie brauchen, und das schließt auch Abstraktionen ein.

Jon Raynor
quelle
1
Genau das hat die ganze Diskussion ausgelöst. Und ich habe nur 3-4 Abstraktionen zusätzlich zur vorhandenen Funktionalität eingeführt
ThuneGrill,