Private methods [OBJ-C]

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 12:17
Ik vroeg me af, hoe pakken jullie private methods in Objective-C aan? Nu zijn hier niet zo veel Obj-C programmeurs volgens mij, maar toch.

Voor zo ver ik weet is er namelijk geen ondersteuning voor private methods, methods zijn 'altijd public' en instance variabelen altijd protected.

Nu zou je het bijvoorbeeld via deze manier kunnen doen: http://screencustoms.com/...uidelines-private-methods

Door de private methods in de .m file te declareren ipv de .h en er een _ voor te plaatsen (conventie) om te zien dat hij private is. Maar in runtime kan je wel gewoon de 'private' methods vanuit een ander object aanroepen. (Je krijgt wel warnings omdat hij de declaraties niet kan vinden (staan in .m), maar de code loopt gewoon).

Hoe pakken jullie dit aan?

Tweakers Time Machine Browser Extension | Chrome : Firefox


Acties:
  • 0 Henk 'm!

  • sportlover
  • Registratie: Februari 2008
  • Laatst online: 09:39
Ik plaats de private methods declarations in de .m file.

Boven de @implementation:
C: SomeClass.m
1
2
3
@interface SomeClass (PrivateMethods)
    -(void)doSomeAction;
@end

Acties:
  • 0 Henk 'm!

  • TUX2K
  • Registratie: September 2001
  • Laatst online: 03-09 16:06
Als je de code hier boven gebruikt kan je de methode nog steeds aanroepen.
De compiler geeft wel een warning maar het werkt wel.

Echt private zou je zo kunnen doen:
C: SomeClass.m
1
2
3
@interface SomeClass ()
    -(void)doSomeAction;
@end

Acties:
  • 0 Henk 'm!

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 12:17
@TUX2K wat is het verschil met jou code en die van SportLover behalfe dat you category leeg is? :)

Zal eens zoeken wat een category precies doet

edit:

En is het gebruikelijk in Obj-C om methods private te maken? Zelf als Php / Java-er vind ik het wel een fijn gebruik, maar ben het in Obj-C eigenlijk niet tegengekomen.

[ Voor 59% gewijzigd door ZpAz op 22-01-2011 11:08 ]

Tweakers Time Machine Browser Extension | Chrome : Firefox


Acties:
  • 0 Henk 'm!

  • sportlover
  • Registratie: Februari 2008
  • Laatst online: 09:39
TUX2K schreef op vrijdag 21 januari 2011 @ 22:58:
Als je de code hier boven gebruikt kan je de methode nog steeds aanroepen.
De compiler geeft wel een warning maar het werkt wel.
Persoonlijk: ik zie een warning als een error.
ZpAz schreef op zaterdag 22 januari 2011 @ 11:07:
edit:

En is het gebruikelijk in Obj-C om methods private te maken? Zelf als Php / Java-er vind ik het wel een fijn gebruik, maar ben het in Obj-C eigenlijk niet tegengekomen.
Ik denk dat het een eigen mening betreft.
Ik vind dat alles wat niet public hoeft te zijn ook niet public moet zijn, je maakt het private of protected.
Als dat tenminste mogelijk is.

[ Voor 45% gewijzigd door sportlover op 22-01-2011 11:55 ]


Acties:
  • 0 Henk 'm!

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 12:17
sportlover schreef op vrijdag 21 januari 2011 @ 22:49:
Ik plaats de private methods declarations in de .m file.

Boven de @implementation:
C: SomeClass.m
1
2
3
@interface SomeClass (PrivateMethods)
    -(void)doSomeAction;
@end
Als ik de source bekijk van bijvoorbeeld Sequel Pro (opensource database management programma voor OSX) dan doen hun het inderdaad op deze manier. Maar nu vraag ik me af, wat is het verschil met de code van TUX2K doordat hij de categorie leeg laat?
Ik vind dat alles wat niet public hoeft te zijn ook niet public moet zijn, je maakt het private of protected.
Inderdaad, maar als het een compleet ongebruikelijk iets is in Objective-C dan is het wat lastiger voor andere om je code te begrijpen.

[ Voor 19% gewijzigd door ZpAz op 22-01-2011 19:22 ]

Tweakers Time Machine Browser Extension | Chrome : Firefox


Acties:
  • 0 Henk 'm!

  • MacWolf
  • Registratie: Januari 2004
  • Laatst online: 06-09-2024
ZpAz schreef op zaterdag 22 januari 2011 @ 11:07:
@TUX2K wat is het verschil met jou code en die van SportLover behalfe dat you category leeg is? :)

Zal eens zoeken wat een category precies doet

edit:

En is het gebruikelijk in Obj-C om methods private te maken? Zelf als Php / Java-er vind ik het wel een fijn gebruik, maar ben het in Obj-C eigenlijk niet tegengekomen.
Ik gebruik de eerder genoemde methodiek (methode declaraties in implementatie middels categories) voornamelijk omdat ik het nettere stijl vindt en om compiler warnings te voorkomen. Voor zover ik gezien heb worden "private methods" wel veel gebruikt in Obj-C.

Edit: voor een category kan je iedere willekeurige naam gebruiken, of leeg laten. Het gaat hierbij meer om een persoonlijke stijl, daarnaast moet natuurlijk voorkomen worden dat 2 categories op een klasse dezelfde naam hebben. Persoonlijk geef ik dan ook altijd de naam (Private) mee als category voor de private methodes, dat lijkt me redelijk veilig.

Edit 2: waarschijnlijk is het concept van categories nog niet helemaal duidelijk voor je. Categories worden voornamelijk gebruikt om bestaande classes uit te breiden zonder een subklasse te maken. Zo had ik gisteren voor een project een functie nodig om HTML tags te verwijderen en HTML entiteiten te vervangen voor de bijbehorende tekens. Dus van een project op internet o.a. de volgende code gedownload en toegevoegd aan het project:

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//
// ... comments ...
//

#import <Foundation/Foundation.h>

// Dependant upon GTMNSString+HTML

@interface NSString (HTML)

// Instance Methods
- (NSString *)stringByConvertingHTMLToPlainText;
- (NSString *)stringByDecodingHTMLEntities;
- (NSString *)stringByEncodingHTMLEntities;
- (NSString *)stringWithNewLinesAsBRs;
- (NSString *)stringByRemovingNewLinesAndWhitespace;

// DEPRECIATED - Please use NSString stringByConvertingHTMLToPlainText
- (NSString *)stringByStrippingTags; 
@end


Nadat de .h, .m en dependencies toegevoegd zijn kunnen op instanties van NSString bovenstaande functies aangeroepen worden. Bij dit soort categories (uitbreidingen op classes van Apple) voeg ik ze gewoonlijk toe aan de prefix header om compiler warnings te voorkomen.

[ Voor 56% gewijzigd door MacWolf op 22-01-2011 20:00 ]

Microsoft Windows: A thirty-two bit extension and graphical shell to a sixteen-bit patch to an eight-bit operating system originally coded for a four-bit microprocessor which was written by a two-bit company that can't stand one bit of competition.

Pagina: 1