Frage

Ich habe jetzt schon eine Weile über diese Frage nachgedacht ...

Auf der einen Seite, Interface Builder bietet eine wirklich einfache Möglichkeit, die Schnittstelle und verdrahten die Elemente zu entwerfen mit Objekten im Code.

Auf der anderen Seite, in größeren Projekten, Interface Builder wird ein Streit zu halten.

würde Irgendwelche Vorschläge sehr geschätzt.

War es hilfreich?

Lösung

Ich war einmal sehr stark gegen die Verwendung von Interface Builder in meinen eigenen Projekten. Dies war aufgrund einer Reihe von Faktoren ab. Ich begann zuerst mit den Xcode Tools zu arbeiten, wenn das iPhone SDK zurück in der Beta war (etwa im März 2008), und da ich nicht von einem Mac Cocoa Hintergrund kam war ich etwas nicht kennen Sie es. Dies war nicht der wichtigste Faktor in meiner anfänglichen Ablehnung der IB für iPhone Entwicklung, obwohl -. Interface Builder für iPhone-Entwicklung während der ersten iPhone SDK Beta hat tatsächlich saugen und es war ein Schmerz zu verwenden,

Allerdings ist die Geschichte ganz anders mit dem heutigen iPhone SDK. Zwar gibt es noch einige sicherlich ärgerlich IB Bugs sind, habe ich eine fast vollständige 180˚ mit meiner Einstellung zu verwenden Interface Builder getan. Mehr als oft nicht, es ist eine gute Idee in Ihren Projekten Interface Builder zu verwenden, die ich gefunden habe. Es ist ein großes Werkzeug jetzt, und Sie sollten sie davon Gebrauch machen.

Nun verstehen Sie mich nicht falsch - ich bin immer noch fest im Lager, der glaubt, dass Sie sollten in der Lage zu implementieren etwas Sie tun im Interface Builder allein unter Verwendung von Code und ich denke, in der Lage, Dazu ist von unschätzbarem Wert. Sie Interface Builder nicht als Krücke benutzen - Sie nur sich selbst verletzt werden (und Ihre Produktivität oder die Qualität Ihrer Produkte) am Ende. Während die Drag-and-Drop-Nettigkeiten von IB sind für 90% von dem, was Sie tun müssen, werden, wenn Sie etwas Gewohnheit haben, das implementieren können nur in Code durchgeführt werden, werden Sie entweder Wunsch war ihr gefolgt oder dankbar sein für diesen Rat folgen. Ich hatte das Glück IB zu hassen lange genug, dass ich mich gelehrt, wie man allein alles in Code zu tun, und dann angewendet, dieses Wissen zurück zu IB.

Bearbeiten
Um den Mangel an Wiederverwertbarkeit (vermeintlich oder real) mit NIBs gegen Code ... Sie werden nicht etwas umsetzen, die gemeint ist stark im Interface Builder alle Wahrscheinlichkeit wiederverwendet werden. Sie können nicht wirklich eine benutzerdefinierte Steuerung oder Ansicht in IB machen, damit ausgeschlossen ist, und in den meisten Fällen Sie gehen eine View-Controller-Unterklasse zu implementieren, die einen bestimmten Zweck zu adressieren gebaut wird. Sie sollten immer natürlich bemüht, Ihren Code und die damit verbundene Ressourcen als wiederverwendbare wie möglich zu machen. Dies könnte Designüberlegungen umfassen, um sicherzustellen, dass Sie nicht unnötig View-Controller-Subklassen duplizieren, die sehr ähnlich sind.

Andere Tipps

Builder verwenden befreit Sie von Code, den Sie sonst benötigen würden zu halten und desto weniger müssen Sie besser halten.

Die Layouts von IB gebaut haben einige Wartungsarbeiten erfordern, aber es ist ein Standardwerkzeug mit einer eigenen Dokumentation und eine eigenen Online-Unterstützung (Foren, Listen, etc.). Wenn jemand anderes jemals in Ihren Code springen muss, können Sie praktisch garantieren sie Erfahrung mit IB haben, aber nicht unbedingt Ihre besonderen Stil Layout Gebäude.

Es hängt von Ihren Vorlieben.

Ich ziehe es in Code zu schreiben.

  1. Ich erhalte den Code wieder zu verwenden.
  2. Mit einem XIB / SPITZE im Allgemeinen bricht die eine Definitionsregel (wenn Sie irgendeine Anpassung tun).
  3. XIB / SPITZE Wartung ist oft mühsam und fehleranfällig (ODR). Ich mag nicht wirklich Knopfarten (Beispiel) für jede Taste gehalten wird.
  4. zirkuläre Referenzen sind wahrscheinlicher.
  5. -Code / Objekte / ib Instanzen sind oft weniger wiederverwendbar / modular aufgebaut. Obwohl ich bin der Typ ein ui Objekt zu vermeiden, der alles kann.
  6. Latente / mehrdeutig Initialisierungsreihenfolge sorgt für einen ziemlich beängstigend Zustand für die Kunden, die sie darf auf keinen Fall für die Verwendung oder vollständig initialisiert ein Objekt bereit annehmen (es sei denn, Sie diese Kontrollen halten bevorzugen, was ein guter Weg, um Zeit zu verschwenden).
  7. Wenn die Leistung wichtig ist, erraten, welche schneller ist?
  8. Resource Management vs Linker ... ernsthaft, habe ich geschrieben Teilprogramme und Tests nibs Existenz im Bündel zu überprüfen.

IB ist für Prototyping und Browsing-Objekt Fähigkeiten und Erscheinungen (Ich bin kein Grafiker), obwohl I denke, es ist am einfachsten ist es einfach in Code zu schreiben, sobald der Prototyp liegt vor, wenn Sie welche haben Absicht der Aufrechterhaltung oder Wiederverwertung.

Meine Empfehlung:. Schreiben sehr wiederverwendbar und stabile Code-Bibliotheken und IB verwendet in erster Linie für das Prototyping und Einmaleffekte


Antworten:

  

Sbrocket. Ich bin neugierig, warum Sie behaupten, dass zirkuläre Verweise eher als Folge auftreten NIBs der mit

Hallo Sbrocket: Ich werde damit beginnen, dass ich Interface Builder seit den Builder Tage Projekt verwendet haben (Xcode Vorgänger)

.

Der Mangel an zuverlässiger strukturierter Besitz, Identität und Initialisierung. Ich glaube nicht, will ivars IB-Verbindungen wird, weil es viele Klassen erschwert ‚aktuellen Kontext‘ zu verwenden, darüber hinaus, mit anderen Worten, es den Code bindet an die Ressource (häufiger als im Idealfall). Da Sie nicht Initialisierungsreihenfolge definieren können oder initializers oder zusätzliche Initialisierung Argumente in IB definieren, müssen Sie dann die Objekte umeinander machen wissen, zirkuläre Abhängigkeiten und Referenzen zu schaffen.

  

Sbrocket:. Oder warum faul Initialisierung (unter der Annahme, dass in der Tat ist das, was Sie sich beziehen) ist so beängstigend, wenn sein relativ einfach (oder in der Tat automatischer in vielen Fällen), um sicherzustellen, dass das Objekt initialisiert und mit

Re: beängstigend Ich spreche nicht über faul Initialisierung. Ich sprach über die latenten und mehrdeutig Initialisierungsreihenfolge.

Nib Initialisierung halb bestellt. Der eigentliche Auftrag / Vorgang kann variieren, und dies kann nicht zuverlässig in wieder verwendbaren introspektiv Programme verwendet werden ... wieder, Sie würden am Ende zu viel Code zu schreiben, die die Wiederverwendung zerbrechlich, unmöglich ist, kann niemals vorhersagbar verhalten sicher sein, und muss immer validieren Zustand (noch einen weiteren Eintrag für die Zirkularabhängigkeit). Wenn es nicht eine einmalige Implementierung ist, warum mit den Komplikationen der Mühe machen?

Dieser Ansatz zur Programmierung ist chaotisch und die Implementierungen müssen (wiederum) hergestellt werden, etwas behandeln zu jeder Zeit. Es ist eine Sache zu schützen, sich von Abstürzen, aber defensiv, Produktionsebene Code in diesem Zusammenhang zu schreiben ... auf keinen Fall.

Es ist viel einfacher, ein konsequentes Programm zu schreiben, die Initialisierung die Gültigkeit im Kontext bestimmt, die die Implementierungen können dann wissen (wenn initialisiert), dass das Objekt generell bereit ist, verwendet werden. Sonderfall Komplexität minimiert wird. Viele solche Designs fallen auseinander, wie Programmkomplexität erhöht, während Bibliothek Autoren Schichten über Schichten von ‚Schutzmaßnahmen‘ nur hinzufügen, Zahnrad in Bewegung zu halten - Threading für solche heisenbugs ein großer Eintrag ist. Unnötige Zweideutigkeiten sind unerwünscht in wieder verwendbare Produktion Level-Code; Menschen sollten nicht Verweis der alle von einem Programm Sonderfälle überqueren und die Komplexität KonzErning definiertes Verhalten und Sonderfälle nur verbreitet oder ignoriert werden (vorausgesetzt, sie richtig verfolgt und dokumentiert werden, die es richtig von Anfang an als das Schreiben mehr gemeinsame Anstrengung ist). Ich denke, wir können alle einig, dass belastende Schnittstellen und Implementierungen sollten vermieden werden.

  

Sbrocket: Ich würde auch interessieren einige harte Zahlen zu sehen, die zeigen, dass NIB Laden langsamer - natürlich, so scheint es sinnvoll auf den ersten Gedanken zu machen, aber wir sind immer so schlechte Prädiktoren für Performance-Engpässe ohne einige harte Prüfung.

Ich habe nie gesagt (explizit), dass es langsamer:)

Ok, in Ernst, NIB Aufheben der Archivierung war (für mich) einen überraschend langsamen Prozess, obwohl unsere Vorstellungen von langsamen und dearchivieren mal dramatisch variieren können.

Beispiel: Ich hatte ein Dokument basierte Anwendung, und die Spitze Laden war mehrmals langsamer als das Dokument laden, wenn Dokumentgrößen mehrmals die Spitze Größe waren. Das Verschieben der Umsetzung Code machte den Prozess viel schneller. Sobald es auf Code war und ich die Kontrolle über Initialisierungsreihenfolge hatte, entfernte ich mehrere Multithreading Komplexitäten (Checkpoints, Schlösser, Race-Condition-Einträge, etc.), das Laden von Dokumenten noch schneller gemacht.

Nun, da Sie eine explizite Antwort haben, werde ich Sie daran erinnern, dass Sie alle Werkzeuge, die Sie benötigen, wenn die Leistung zu messen.

Beachten Sie, dass die Leistungsanalyse und Verbesserungen sind gelernt .

Interface Builder ist für ein gewisses Maß an Komplexität. Für die Dinge mehr oder weniger komplex, würde ich lieber tun es im Code.

Wenn Sie eine Schnittstelle haben, die mehrere, aber nicht viele Elemente hat, wird nicht in mehr als einer Weise verwendet werden, und benötigt keine tricky Layout, als IB groß ist.

Auf lange Sicht, habe ich fast nie IB verwenden. Das ist so viel die Art der Projekte, die ich arbeiten als persönliche Präferenz. Es gibt auf jeden Fall einige Schnittstellen, die ich für die gerade zu IB Kopf, aber ich habe nicht einer von denen, benötigt eine Weile zu schaffen.

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