2013-06-15 7 views
9

Ich baue ein Projekt, das ich als Open Source betrachten könnte. Ich habe eine UIView-Kategorie, die mir einfache Zugriffsmethoden zum Setzen von x, y-Koordinaten oder Breite und Links direkt zu einer UIView gibt, ohne sich mit dem Frame zu beschäftigen. Meine Frage ist, sollte ich solche Kategorien in meinem Projekt verwenden, wenn ich vorhabe, es zu öffnen?Sollte ich benutzerdefinierte Kategorien in meine Open Source-Projekte aufnehmen?

Viele Projekte werden wie eine ähnliche Kategorie mit Methoden für UIView haben

- (void)setLeft:(CGFloat)left; 

oder

- (void)setX:(CGFloat)x; 

Und mein Verständnis ist, dass, wenn zwei Kategorien ein Verfahren schaffen, haben Sie keine Garantie haben, über welches wird angerufen werden.

Also ... was soll ich tun? Benutze überhaupt keine Kategorie und behandle diesen lästigen Code in meinem Open-Source-Projekt? Verwenden Sie Kategorien und vielleicht Präfix die Methodennamen?

Vielen Dank!

Antwort

11

Keine Mühe, diese Methoden hinzuzufügen.

Sie sparen sehr wenig Tipparbeit, das Präfix, das Sie wirklich hinzufügen sollten, wird hässlich sein, und sie fügen fast keine echte Bequemlichkeit hinzu, während Code gegen die hinzugefügte API nicht portierbar zu Projekten gemacht wird, die es fehlen.

Mit einer Reihe von Komfort-Methoden macht es erheblich schwieriger, Subklassen zu bilden. Welche Methode (n) müssen Sie überschreiben? Wie ist das Verhalten von KVO? Gibt es eine primitive Methode, durch die alles durchgeschleust wird, oder musst du wirklich alles außer Kraft setzen?

Die Frameworks fügen im Allgemeinen keine solche Convenience-API hinzu, da sie der API eine Menge zusätzliches "Gewicht" verleiht, während alle oben genannten Probleme auftreten. All diese zusätzlichen Methoden sind nur mehr Datenpunkte, über die der Entwickler mehr erfahren, sich erinnern und anderen erklären muss, wenn er neue Leute in das Projekt einführt.

Eine Ausnahme sind die Klassenclusterklassen; NSString, NSArray, etc ... Sie verfügen über eine Reihe grundlegender Methoden, die alle erforderlichen Funktionen zum Implementieren der restlichen APIs bereitstellen. Der Rest der Methoden in den abstrakten Klassen wird vollständig in Bezug auf diese primitiven Methoden implementiert. Bei der Unterklassenbildung müssen Sie nur die Grundelemente implementieren und alle anderen Verhaltensweisen "funktionieren". Unterklassen können jedoch beliebige der Nicht-Primitiven für Optimierungs- oder Anpassungszwecke überschreiben (obwohl Vorsicht geboten ist, sollten Sie das Verhalten wirklich beibehalten).

Die allgemeine Faustregel lautet: Wenn eine Convenience-API nicht regelmäßig mehr als ein paar Zeilen Code speichert, lohnt es sich nicht.

5

Da Objective C keine Namespaces unterstützt, ist es üblich, den Code als eindeutig zu kennzeichnen, wenn Sie beabsichtigen, ihn zu teilen, indem Sie den Methoden einige wenige Buchstaben zuweisen, die sich speziell auf Ihr Projekt beziehen.

Wenn Sie setLeft umbenennen und setX LMSetLeft und LMSetX nennen, sollten Sie die Wahrscheinlichkeit von Kollisionen deutlich reduzieren.

Dies sollte auch eine wirklich einfache Änderung sein, solange Sie das Refactor-Tool Ihrer IDE verwenden.