2016-05-08 8 views
4

Ich habe eine Klasse namens ABCCalendarView. Es erfordert eine NSCalendar und ruft dieses Objekt von seinem Stellvertreter ab. Ich versuche herauszufinden, wie diese Delegate-Methode bezeichnet werden soll, und ich möchte mich den Best Practices des Cocoa-Frameworks anpassen.Richtige Namenskonvention für eine Delegate-Methode ohne Argumente außer dem delegierenden Objekt?

Nach the 'Naming Methods' section of Apple's 'Coding Guidelines for Cocoa', sollte ich:

  • Starten Sie den Namen mit der Klasse des Objekts zu identifizieren, der die Nachricht schickt:

    - (BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(int)row; 
    - (BOOL)application:(NSApplication *)sender openFile:(NSString *)filename; 
    

    Der Klassenname lässt das Präfix und die Der erste Buchstabe steht in Kleinbuchstaben.

  • Ein Doppelpunkt wird an den Klassennamen angehängt (das Argument ist eine Referenz auf das delegierende Objekt), es sei denn, die Methode hat nur ein Argument, den Absender.

    - (BOOL)applicationOpenUntitledFile:(NSApplication *)sender; 
    

Dies würde darauf hindeuten ich die Methode nennen sollte:

- (NSCalendar *)calendarViewUsesCalendar:(ABCCalendarView *)calendarView; 

jedoch auf konkrete Beispiele für diese Situation im Rahmen Cocoa suchen, kann ich sehen, dass die tatsächliche verwendete Konvention scheint in diesem Fall den Klassennamen am Ende des Methodennamens zu setzen. Zum Beispiel:

// UITableViewDataSource has the method: 
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 

// UITableViewDelegate has: 
- (NSIndexPath *)indexPathForPreferredFocusedViewInTableView:(UITableView *)tableView 

// UIScrollView has: 
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView 

Wenn ich an diese Konvention, die ich würde vorschlagen, sollte meine Methode aufrufen:

- (NSCalendar *)calendarForCalendarView:(ABCCalendarView *)calendarView; 

Warum gibt es scheinbar eine Diskrepanz zwischen Apples Richtlinien und was sie tatsächlich getan haben? Und welcher Konvention sollte man bei der Erstellung einer Delegate-Methode folgen, die im Grunde nur eine Eigenschaft des aufrufenden Objekts setzt?

+1

Meinten Sie für Ihre "Vorher" und "Nachher" vorgeschlagenen Methodensignaturen anders zu sein? Im Moment sind sie beide "calendarViewUsesCalendar:". Ich würde wahrscheinlich die Methode so etwas nennen wie '- (NSCalendar) calendarForCalendarView: (ABCCalendarView *) aCalendarView;' .... – NSGod

+0

+1 @NSGod Sogar da könnte es Vorteile geben, Delegate-Methoden zu erkennen, indem man einen Klassennamen ganz am Anfang hat, Lesbarkeit trifft alles. (Und "For" ist bei weitem besser als 'Uses'). BTW: Ich wollte in einem solchen Fall viele Jahre lang Methodenname-Präfixe haben. –

+0

-präfixe + suffixe –

Antwort

1

Ich denke, dass rules document ist leicht intern inkonsistent. Es gibt zwei "Allgemeine Regeln", die angeben:

Wenn die Methode ein Attribut des Empfängers zurückgibt, benennen Sie die Methode nach dem Attribut.

und

Machen Sie das Wort vor dem Argument das Argument beschreiben. Diese

, zusammen mit dem Präzedenzfall in dem Namen des SDK, argumentieren sowohl für Ihre zweite Formulierung:

- (NSCalendar *)calendarForCalendarView:(ABCCalendarView *)calendarView; 

Ich denke, es gibt genügend Beweise in den SDK-Namen, die die Regel, die Sie in den Delegaten Abschnitt gefunden soll neu formuliert werden.Wie Sie weisen darauf hin, heißt es

den Namen durch die Identifizierung der Klasse des Objekts starten

, der die Nachricht sagen

aber es sollte schickt, meiner Meinung nach: „eine Instanz des Anrufers Jemandem der erste Parameter ". Welches ist eine halbe Benennungsregel, ein halbes Designmuster. Damit können diese Delegiertennamen für einzelne Parameter und Attribute die Form returnTypeSenderType: haben (was in der Praxis der Fall ist), ohne mit den anderen Teilen des Dokuments in Konflikt zu geraten.

+0

stimme ich vollständig zu. Wenn Sie diese letzte Regel nur etwas anders interpretieren, macht das Ganze sehr viel Sinn. Ich werde mit dieser Namenskonvention gehen (die, die Apple in der Praxis zu verwenden scheint), wie Sie vorschlagen. Vielen Dank. – Frakur