Frage

Ich bin forschen und Experimentieren mehr mit groovigen und ich bin versucht, wickeln Sie meinen Geist um die vor-und Nachteile der Umsetzung der Dinge, die in Groovy, die ich nicht/nicht in Java.Dynamische Programmierung ist immer noch nur ein Konzept ist für mich, da ich schon tief durchdrungen von statischen und stark typisierte Sprachen.

Groovy gibt mir die Fähigkeit, Ente-Typ,, aber ich kann nicht wirklich sehen, den Wert.Wie ist duck-typing produktiver als die statische Typisierung?Was kann ich tun, in meinem code der Praxis, um mir zu helfen erfassen die Vorteile von es?

Ich Frage diese Frage mit groovigen im Sinn, aber ich verstehe es nicht unbedingt ein Groovy Frage so begrüße ich die Antworten von jedem code camp.

War es hilfreich?

Lösung

Das nächste, was besser ist:EMACS oder vi?Dies ist einer der running religiöse Kriege.

Denken Sie an es auf diese Weise:jedes Programm, richtige, wird richtig sein, wenn die Sprache statisch typisiert.Was die statische Typisierung ist, können die compiler genügend Informationen, um zu erkennen geben Missverhältnis zur Kompilierzeit statt zur Laufzeit.Dies kann ein ärgernis sein, wenn Ihr tut inkrementelle Arten der Programmierung, obwohl (behaupte ich), wenn du bist, klar zu denken über Ihr Programm es spielt kaum eine Rolle;auf der anderen Seite, wenn Sie ein wirklich großes Programm, wie ein Betriebssystem oder ein Telefon-switch, mit Dutzenden oder Hunderten oder tausenden von Menschen, die daran arbeiten, oder mit wirklich hohen Zuverlässigkeitsanforderungen, dann, nachdem er compiler in der Lage sein zu erkennen, dass eine große Klasse von Problemen für Sie, ohne dass Sie einen test-Fall-übung genau die richtige code-Pfad.

Es ist nicht so, wenn die dynamische Eingabe ist eine neue und verschiedene Dinge:C, für Beispiel, ist effektiv, dynamisch typisierte, da kann ich immer gewirkt foo* zu einem bar*.Es bedeutet nur, es ist dann meine Aufgabe als C-Programmierer verwenden Sie niemals code, der auf ein bar* wenn die Adresse ist wirklich verweisen auf eine foo*.Aber als Folge der Probleme mit großen Programme, C wuchs tools wie lint(1), stärkte seine Typ-system mit typedef und irgendwann entwickelt sich eine stark typisierte Variante in C++.(Und, natürlich, C++ wiederum entwickelt Wege, um das starke Typisierung, mit allen Sorten von Formen und generics/templates und mit RTTI.

Eine andere Sache, aber --- nicht zu verwechseln mit der "agile Programmierung" mit "dynamischen Sprachen". Agile Programmierung ist über die Art der Zusammenarbeit in einem Projekt:kann das Projekt die Anpassung an sich verändernde Anforderungen zu erfüllen die Bedürfnisse der Kunden, während die Erhaltung einer menschenwürdigen Umwelt für die Programmierer?Es kann getan werden mit dynamisch typisierten Sprachen, und oft ist, weil Sie können werden mehr produktiv (z.B., Ruby, Smalltalk), aber es kann getan werden, erfolgreich durchgeführt wurde, in C als auch assembler.In der Tat, Rallye-Entwicklung auch nutzt agile Methoden (SCRUM im besonderen) zu tun, marketing und Dokumentation.

Andere Tipps

Viele der Kommentare für duck-Typisierung nicht wirklich untermauern die Ansprüche.Nicht "Gedanken" über eine Art ist nicht nachhaltig für die Wartung oder eine Anwendung erweiterbar.Hatte ich wirklich eine gute Möglichkeit, um zu sehen, Grails in action-über meinen letzten Vertrag, den und seine sehr lustig, wirklich.Alle freuen sich über die Gewinne, die in der Lage zu "erstellen-app" und Los geht es - leider alles holt Sie auf dem back-end.

Groovy scheint den gleichen Weg zu mir.Sicher, Sie können schreiben sehr prägnante code-und auf jeden Fall gibt es einige nette Zucker, wie wir uns an die Arbeit mit Eigenschaften, Sammlungen, etc...Die Kosten sind aber nicht zu wissen, was zum Teufel wird hin und her gepasst wird nur noch schlimmer und schlimmer.Irgendwann Ihr am Kopf kratzen, Frage mich, warum das Projekt hat sich zu 80% - Prüfung und 20% arbeiten.Die Lektion hier ist, dass "kleinere" nicht für "besser lesbar" - code.Sorry Leute, Ihre einfache Logik - je mehr Sie haben, um zu wissen intuitiv, dann je komplexer der Prozess des Verstehens, der code wird.Es ist der Grund, warum GUI ' s have backed off allzu sehr zu ikonischen Laufe der Jahre - sieht sicher schön aus, aber MIT vor sich geht, ist nicht immer offensichtlich.

Die Menschen auf, das Projekt schien Schwierigkeiten haben "festzunageln" die Lektionen gelernt, aber wenn man das Verfahren der Rückkehr entweder ein einzelnes element vom Typ T, ein array von T, eine ErrorResult oder eine null ...es wird ziemlich offensichtlich.

Eine Sache, die die Arbeit mit Groovy für mich getan hat, aber - awesome verrechenbaren Stunden woot!

Es ist nichts falsch mit der statischen Typisierung wird, wenn Sie die Verwendung von Haskell, die eine unglaubliche static type system.Allerdings, wenn Sie mit Sprachen wie Java und C++, die schrecklich lähmende Typ-Systeme, duck-typing ist definitiv eine Verbesserung.

Vorstellen versuchen zu verwenden Sie etwas so einfaches wie "Karte"in Java (und Nein, ich meine nicht die Daten-Struktur).Auch Generika sind eher schlecht unterstützt werden.

Duck typing Krüppel meisten modernen IDE statische Prüfung, die zeigen können, aus Fehlern während der Eingabe.Einige halten dies für einen Vorteil.Ich will die IDE/Compiler um mir zu sagen, ich habe eine dumme Programmierer trick so bald wie möglich.

Meine aktuellen Lieblings-argument gegen duck typing kommt aus einem Grails-Projekt DTO:

class SimpleResults {
    def results
    def total
    def categories
}

wo results stellt sich heraus zu sein, so etwas wie Map<String, List<ComplexType>>, die entdeckt werden kann nur durch Anschluss an eine Strecke der Methodenaufrufe in verschiedenen Klassen, bis Sie finden, wo es erstellt wurde.Für die unheilbar neugierigen, total ist die Summe der Größen der List<ComplexType>s und categories ist die Größe des Map

Es wurde deutlich, dem ursprünglichen Entwickler, aber die schlechte Wartung Kerl (ME) viele Haare verloren tracking diese nach unten.

Es ist ein bisschen schwierig zu sehen, den Wert der duck-Typisierung, bis Sie haben verwendet es für eine kleine Weile.Sobald Sie erhalten verwendet, um es, werden Sie feststellen, wie viel von einer Belastung off Ihre Geist es ist, sich nicht mit Schnittstellen oder sorgen darüber zu machen, was etwas ist.

IMHO, der Vorteil von duck-typing wird verstärkt, wenn man sich an einige Konventionen, wie benennen Sie Variablen und Methoden in einer konsistenten Weise.Nehmen wir das Beispiel von Ken G, Ich denke , es würde gelesen besten:

class SimpleResults {
    def mapOfListResults
    def total
    def categories
}

Angenommen, Sie definieren einen Vertrag über eine operation namens " calculateRating(A,B)', wobei A und B halten sich an einem anderen Vertrag.Im pseudocode würde es Lesen:

Long calculateRating(A someObj, B, otherObj) {

   //some fake algorithm here:
   if(someObj.doStuff('foo') > otherObj.doStuff('bar')) return someObj.calcRating());
   else return otherObj.calcRating();

}

Wenn Sie möchten, um dies zu implementieren in Java, sowohl A und B implementieren müssen einige Art von Schnittstelle, liest sich so etwas wie dieses:

public interface MyService {
    public int doStuff(String input);
}

Neben, wenn Sie wollen zu verallgemeinern Sie Vertrag für die Berechnung der ratings (sagen wir, Sie haben einen anderen Algorithmus für die rating-Berechnungen), Sie haben auch eine Schnittstelle zu erstellen:

public long calculateRating(MyService A, MyServiceB);

Mit Ente eingeben, können Sie Graben Ihre Schnittstellen und nur darauf verlassen, dass zur Laufzeit beide A und B werden richtig reagieren, um Ihr doStuff() Anrufe.Es gibt keine Notwendigkeit für einen bestimmten Vertrag-definition.Dies kann für Sie funktionieren, aber es kann auch gegen Sie arbeiten.

Der Nachteil ist, dass Sie müssen besonders vorsichtig sein, um zu gewährleisten, dass Ihr code nicht brechen, wenn einige andere Personen änderungen (ie, die andere person muss sich bewusst sein, die impliziten Vertrag auf den Namen der Methode und Argumente).

Beachten Sie, dass das verschärft speziell in Java, wo die syntax ist nicht so knapp, wie es sein könnte (im Vergleich zu Scala für Beispiel).Ein Gegenbeispiel dafür ist der Heben Rahmen, wo Sie sagen, dass die SLOC Zählung der Rahmen ist ähnlich Rails, aber der test-code weniger Zeilen, weil Sie nicht implementieren müssen, um Typ-Prüfungen innerhalb der tests.

Hier ist ein Szenario, in dem duck-typing spart Arbeit.

Hier ist eine sehr triviale Klasse

class BookFinder {
    def searchEngine

    def findBookByTitle(String title) {
         return searchEngine.find( [ "Title" : title ] ) 
    }
}

Jetzt für den unit-test:

void bookFinderTest() {
    // with Expando we can 'fake' any object at runtime.
    // alternatively you could write a MockSearchEngine class.
    def mockSearchEngine = new Expando()
    mockSearchEngine.find = {
        return new Book("Heart of Darkness","Joseph Conrad")
    }

    def bf = new BookFinder()
    bf.searchEngine = mockSearchEngine
    def book = bf.findBookByTitle("Heart of Darkness")
    assert(book.author == "Joseph Conrad"
}

Wir waren in der Lage zu ersetzen Sie ein Expando-Objekt für die Suchplattform, wegen der Abwesenheit der statische Typ-Prüfung.Mit statischer Typprüfung, wir hätten um sicherzustellen, dass die Suchmaschine wurde eine Schnittstelle, oder zumindest eine abstrakte Klasse, und erstellen Sie eine vollständige mock-Implementierung von it.Das ist arbeitsintensiv ist, oder Sie können verwenden eine anspruchsvolle single-purpose-mocking framework.Aber duck typing ist eine Allgemeine-Zweck, und hat uns geholfen.

Weil der duck-Typisierung, unsere unit-test kann jede alte Objekt an die Stelle der Abhängigkeit, nur so lange, wie es implementiert die Methoden, die aufgerufen werden.

Zu betonen - Sie können dies in einer statisch typisierten Sprache, mit der sorgfältigen Verwendung von Schnittstellen und Klassenhierarchien.Aber mit Ente Tippen Sie tun können, es mit weniger zu denken und weniger Tastenanschläge.

Das ist ein Vorteil, der duck-Typisierung.Es bedeutet nicht, dass dynamische Typisierung ist die richtige Paradigma für den Gebrauch in allen Situationen.In meinem Groovy-Projekte, die ich mag, zu wechseln Sie zurück zu Java in den Fällen, wo ich das Gefühl, dass der compiler Warnungen über Typen gehen, um mir zu helfen.

Mit, TDD + 100% Code Coverage + IDE-tools, die ständig laufen meine tests habe ich nicht das Gefühl, die Notwendigkeit von statischer Typisierung nicht mehr.Ohne starke Typen, meine unit-Tests hat sich so leicht (verwenden Sie Einfach Karten für das erstellen von mock-Objekten).Speziell , wenn Sie die Verwendung von Generika, kann man den Unterschied sehen:

//Static typing 
Map<String,List<Class1<Class2>>> someMap = [:] as HashMap<String,List<Class1<Class2>>>

vs

//Dynamic typing
def someMap = [:]   

Es ist nicht so, dass duck-typing ist produktiver als die statische Typisierung, soviel wie, es ist einfach anders.Mit der statischen Typisierung wird Sie immer Angst haben, dass Ihre Daten den richtigen Typ und in Java-es zeigt sich durch Gießen, um den richtigen Typ.Mit Ente Eingabe der Typ spielt keine Rolle, solange es die richtige Methode, so es wirklich nur beseitigt viele der ärger der casting-und Konvertierungen zwischen Typen.

@Chris Bunch

Es ist nicht so, dass der statischen Typisierung ist produktiver als duck typing so viel wie es ist einfach anders.Mit duck typing Sie immer Angst haben, dass Ihre Daten das Recht hat, die Methode in Javascript oder Ruby zeigt sich durch eine Menge von Methode testen.Mit der statischen Typisierung ist es egal, wie lange, wie es ist, die richtige Schnittstelle, so dass es wirklich einfach beseitigt viele der ärger der Prüfung und Konvertierungen zwischen Typen.

Sorry, aber ich musste es tun...

Meine Meinung:

Dynamisch typisierte oder Ente typisierte Sprachen sind Spielzeug.Sie können nicht bekommen, Intellisense und verlieren Sie kompilieren (oder Bearbeiten Sie die Zeit -, wenn mit einem ECHTEN IDE wie VS, nicht, dass der Müll anderer Leute denken, sind IDEs) code-Validierung.

Klar bleiben, dass jede Sprache, dass ist nicht statisch typisiert, alles andere ist einfach nur Masochismus.

Zu mir, Sie sind nicht schrecklich anders, wenn Sie sehen, dynamisch typisierte Sprachen, als einfach eine form der statischen Typisierung wird, wo alles erbt von einer hinreichend abstrakten Basisklasse.

Probleme entstehen, wenn, wie viele betont haben, beginnen Sie immer seltsam mit diesem.Jemand wies darauf hin, eine Funktion zurückgibt, die ein einzelnes Objekt, eine Sammlung oder eine null.Haben Sie die Funktion einer bestimmten Art, nicht mehrere.Verwenden Sie mehrere Funktionen für Einzel-vs-Kollektion.

Was es hinausläuft, ist, dass jeder schreiben kann, schlechten code.Statische Typisierung ist eine große Sicherheit Gerät, aber manchmal ist der Helm in die Quere kommt, wenn Sie wollen, zu fühlen, den wind im Haar.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top