Hi, ich schreibe diese Frage, weil ich ein Neuling in ObjC bin und viele Zweifel in mir aufkamen, als ich versuchte, meine erste Trainings-App zu machen. Die Sache ist, dass ich einen starken Hintergrund in C habe, ich habe in Java für das letzte Jahr programmiert und ich habe einige Collagen mit Smalltalk gemacht (ich denke, das sind meine Programmierreferenzen und das sind die Sprachen, die ich ' m Vergleich von ObjC mit).
Das erste Problem, das mir begegnet ist, ist, dass ich nicht weiß, wo ich eine Linie zwischen ObjC und C zeichnen soll, zum Beispiel wenn es um mathematische Operationen geht, sollte ich math.h verwenden oder gibt es einen "object-way" "Wie du in Smalltalk (aNumber raisedTo: 3) kannst? Wie lernt eine Person ohne Hintergrund in C ObjC ?.
Eine andere Sache, die ich nicht finden konnte, war das Protokoll einer Sammlung (ich habe mir die von Apple gegebene Foundation Framework-Dokumentation angesehen). Weil ich eine Expression Tree Class implementieren möchte und ich möchte wissen, ob es Methoden gibt, die alle Collections implementieren sollen (wie in Smalltalk oder Java) oder ich muss jede Collection manuell überprüfen und sehen, ob es eine coole Methode für meine neue Collection gibt haben.
Ich weiß nicht, ob ich zu dumm bin oder nach Features suche, die die Sprache / das Framework nicht hat. Ich möchte in ObjC mit dem ObjC-Stil programmieren, der nicht in C, Java oder Smalltalk denkt.
Tut mir leid, wenn die Frage zu lang war.
Das erste Problem, das mir begegnet ist, ist, dass ich nicht weiß, wo ich eine Linie zwischen ObjC und C zeichnen soll.
Meine Regel besteht darin, C zu verwenden, wo immer es für Sie Sinn macht. Objective-C hat den Vorteil, dass Sie wählen können, wann Sie verfahrensorientiert und objektorientiert sein möchten. Geh mit dem, was am besten zu dem Code passt, den du schreibst.
Eine andere Sache, die ich nicht finden konnte, war das Protokoll einer Sammlung. [...] Ich möchte eine Ausdrucksklasse implementieren und ich möchte wissen, ob es Methoden gibt, die alle Sammlungen implementieren sollten (wie in Java) oder ich muss das überprüfen von Hand jede Sammlung und sehen, ob es eine Methode gibt, die meine Sammlung haben sollte.
Anders als Java hat Objective-C kein Master-Protokoll für Sammlungen wie die java.util.Collection Schnittstelle. Außerdem gibt es keine große Anzahl spezifischer Containerimplementierungen wie in Java. Dies gibt Ihnen jedoch die Freiheit, eine Sammlung so zu implementieren, wie es für Ihren Code sinnvoll ist.
Um eine baumartige Struktur zu erstellen, werfen Sie einen Blick auf NSTreeNode um zu sehen, ob es nützlich sein könnte, (Es kann mehr sein, als Sie brauchen oder wollen, aber vielleicht einen Versuch wert.)
Was das Rollen Ihrer eigenen Sammlung angeht, habe ich viel gelernt, während ich CHDataStructures.framework und Sie "erstellt habe. Gerne können Sie aus diesem Code das verwenden, was Sie möchten, oder Sie sehen sich meine Versuche an, Cocoa-ähnliche Strukturen zu erstellen, die die Foundation-Sammlungen ergänzen und ähnlich funktionieren. Viel Glück!
Verwenden Sie unbedingt <math.h>
. Für Funktionen, die in 30 Zyklen ausgeführt werden, besteht keine Möglichkeit zum Übermitteln von Nachrichten. Sogar der Funktionsaufruf scheint an diesem Punkt ziemlich steil zu sein.
Verwenden Sie ganz allgemein so viel oder so wenig C-Stil, wie Sie möchten. Ich habe Objective-C gesehen, das nichts anderes war als ein paar C-Module, die mit objektiven C-Nachrichten zusammengeklebt wurden, und ich habe Objective-C gesehen, das im Wesentlichen null Codezeilen ohne die eckigen Klammern hat. Ich habe schönen, effektiven Code in beiden Richtungen gesehen. Guter Code ist guter Code, aber Sie schreiben es.
Im Allgemeinen werden Sie C-Funktionen für numerische Berechnungen verwenden. Sie werden normalerweise Objekte für die meisten anderen Dinge verwenden. Der Grund dafür ist, dass Objekte viel schwerer sind als ein einfacher Skalar - das bringt keinen Nutzen. Warum würdest du jemals [[NSNumber numberWithInteger:1] numberByAddingNumber:[NSNumber numberWithInteger:2]]
schreiben, wenn du einfach 1+2
schreiben kannst? Es ist nicht nur schmerzhaft zu lesen, es ist viel langsamer und es bringt dir nichts.
Auf der anderen Seite hat Cocoa reiche Objektbibliotheken für Strings, Arrays, Netzwerke und viele andere Bereiche, und die Verwendung dieser ist ein großer Gewinn.
Zu wissen, was da ist - und somit, was der einfachste Weg ist, etwas zu tun - ist nur eine Frage des Lernens. Wenn Sie denken, dass etwas da sein sollte und Sie es nicht finden können, können Sie entweder hier oder auf der Apple Cocoa-Dev-Mailingliste fragen.
Wie für ein Sammlungsprotokoll - gibt es wirklich keins. Am nächsten kommt das Protokoll NSFastEnumeration, das genau eine Methode definiert: countByEnumeratingWithState:objects:count:
. Auf diese Weise können Sie die for (id someObject in someCollection)
-Syntax zum Auflisten der Objekte in einer Auflistung verwenden. Ansonsten definieren alle Sammlungen ihre eigenen unabhängigen Schnittstellen.
Versuchen Sie, jede Sprache für das zu verwenden, was gut ist. IMHO würde dies Obj-C-Objekte, aber C-ähnliche Code-Implementierungsmethoden enthalten. Verwenden Sie also math.h und präzisen C-Code, um Logik zu implementieren, aber scheuen Sie sich nicht, Obj-C-Klassen zu verwenden, um Ihre größeren Funktionsblöcke in etwas zu organisieren, das Sinn ergibt.
Versuchen Sie außerdem, mit den Frameworks unter Verwendung ihres Stils zu interagieren, damit Sie nicht upstream laufen.
Wie bereits erwähnt, gibt es kein echtes Protokoll für abstrakte Collection-Klassen (abgesehen vom NSFastEnumeration
-Protokoll, das die for(id item in collection)
-Syntax bereitstellt, wenn es implementiert wird), aber es gibt Konventionen, denen man folgen sollte.
Apples Einführung in Coding Guidelines for Cocoa deckt einige davon ab, und es gibt in der Tat einen Abschnitt zur Benennung von Auflistungsmethoden, der die allgemeinen Fälle abdeckt (beachten Sie jedoch, dass generische Containerklassen wie NSArray
den Begriff "Object" verwenden) im Gegensatz zu "Element", das in den Beispielen aufgeführt ist - also addObject:
, removeObject:
usw.).
Die hier aufgeführten Muster sind (unter anderem) von entscheidender Bedeutung, wenn Sie möchten, dass Ihre Klassen KVC-konform sind, sodass andere Benutzer Änderungen an den Eigenschaften Ihres Objekts beobachten können.
Tags und Links objective-c cocoa