2008-11-12 16 views
9

Objective-C 2.0 dostarczył nam @ właściwości.Unikanie @ własności-itis (tj. Nadużywanie właściwości, jeśli są one odpowiednie)?

  • Umożliwiają introspekcję.
  • Pozwalają na programowanie deklaratywne.
  • Mechanizmy @synthesize i @dynamic zwalniają z konieczności pisania powtarzalnych, dostępnych elementów.
  • Wreszcie istnieje składnia właściwości "kropka", którą niektórzy kochają, a niektórzy nienawidzą.

To nie jest to, o czym słyszę. Jak każda nowa funkcja, istnieje tendencja do korzystania z @property wszędzie. Gdzie zatem właściwe jest użytkowanie nieruchomości?

Oczywiście w modelach obiekty, atrybuty i relacje są dobrą pożywką dla właściwości.

@property(...) NSString *firstName; 
@property(...) NSString *lastName; 
@property(...) Person *parent; 

Nawet zsyntetyzowane/wyliczone atrybuty wydają się być dobrym przykładem użycia dla właściwości.

@property(...) NSString *fullName; 

Gdzie jeszcze używałeś nieruchomości? Gdzie ich użyłeś, a później uznałeś, że było to nieodpowiednie korzystanie z tej funkcji?

Czy korzystasz z właściwości dla swoich atrybutów obiektów prywatnych?

Czy możesz wymyślić jakieś przykłady rzeczy, które nie są właściwościami w kakao, które na pierwszy rzut oka wydają się być nieruchomościami, ale po dokładniejszym zbadaniu są faktycznym przykładem nadużycia lub własności?

Odpowiedz

7

Moja rekomendacja dla ludzi polega na używaniu nieruchomości gdziekolwiek jest to możliwe. Jeśli pracujesz w środowisku framework, możliwość użycia niewrażliwych zmiennych instancji w nowoczesnym środowisku wykonawczym jest ogromną premią, a jeśli nie, właściwości wyjaśniają, jak zarządzane są twoje ivars (przypisane vs zachowane vs skopiowane) . Nie ma nieodłącznej utraty wydajności od deklarowania właściwości innej niż czas potrzebny do napisania wiersza kodu (w rzeczywistości używam do tego fragmentu TextExpander), ale możliwość zapobiegania błędom jest wystarczająco duża, aby stała się fantastyczna najlepsza praktyka. Jeśli planujesz właściwości użytkownika dla prywatnych znaków ivars, możesz to zrobić w pliku implementacji za pomocą bloku @interface. Na przykład

@interface MyObject() 

@property(retain) NSArray *myArray; 

@end 
+0

Kolejną zaletą korzystania z właściwości, gdy tylko możesz, jest automatyczne zatrzymanie ustawienia zmiennej wewnętrznej i konieczność pamiętania o zachowaniu ... –

5

Gdybym miał myśleć o powód ich uniknąć, powiedziałbym, nie używaj go do obliczonych atrybutów gdzie obliczenia zaangażowana jest znaczna. Właściwości zachęcają do kodu takiego jak:

if (foobar.weight > 100) { 
    goober.capacity = foobar.weight; 
} 

W tym przykładzie foobar.weight jest wywoływana dwa razy. Jeśli po prostu zwraca wartość w pamięci podręcznej, nie ma problemu. Ale jeśli trzeba zablokować wątek, podczas gdy uruchamia on robota, aby za każdym razem ręcznie zważyć foobar, powyższy fragment kodu zmarnowałby dwa wdrożenia robotów, gdy tylko jeden jest potrzebny.

W takich przypadkach polecam nie przy użyciu nieruchomości, a także nazywania metodę inaczej, tak, że kod będzie wyglądał bardziej jak:

int w = [foobar computeWeight]; 
if (w > 100) { 
    goober.capacity = w; 
} 

o nazwie typu computeWeight łatwiej jest zapamiętać że jest to długotrwała operacja.

+1

Jest to bardziej problem, który wynika z kiepskiej decyzji projektowej. Akcesor powinien * nigdy * powodować długie obliczenia i powinien zamiast tego zwracać buforowaną wartość lokalną do obiektu będącego właścicielem tej właściwości. Jeśli ma nastąpić długa kalkulacja, powinna być wyraźna. – wisequark

+2

"Akcesor powinien * nigdy * powodować długie obliczenia i powinien zamiast tego zwracać buforowaną wartość lokalną do obiektu będącego właścicielem tej właściwości. Jeśli ma nastąpić długa kalkulacja, powinna być wyraźna. " Czy to w zasadzie nie to, co powiedział? –

+0

Jeśli zdefiniujemy właściwość jako część ivar, która jest odsłonięta za pomocą narzędzia dostępowego lub mutatora lub obu, wtedy wartość computeWeight nie jest taka sama jak getWeight, a getWeight nie musi wywoływać metody computeWeight. – wisequark

0

Unikałbym używania właściwości, jeśli metoda accessor robi coś nieoczywistego dla obiektu, np. Ustawiając niepowiązaną zmienną instancji. Również, jeśli zwracana właściwość nie "przynależy" do obiektu. Na przykład w jednym z moich projektów mam metodę stringValue, w której zdecydowałem się nie tworzyć nieruchomości z tego powodu. To jednak bardziej kwestia stylu.

Powiązane problemy