2013-03-12 15 views
5

Mam zamiar zdefiniować klasę, która wśród jej właściwości zawiera współrzędne dla siatki x/y. Jednak nie jestem pewien "najlepszego" sposobu podejścia do tego projektu. To bardzo prosty problem, chcę tylko zrobić to poprawnie i mieć uzasadnienie!typedef struct vs. Object - Korzyści

Jednym z rozwiązań byłoby posiadanie dwóch właściwości, typu "int", jednego dla xi jednego dla y w obiekcie.

Drugim byłoby zdefiniowanie struktury typedef dwóch int zawierających wartości x/y i nazwanie jej <ClassPrefix>Coordinate. Podobny do CGSize?

Czy istnieją inne/lepsze sposoby na zrobienie tego? Który jest preferowany? Nie wiem, jak uzasadnić tak czy inaczej.

Dzięki!

Tim.

+5

dlaczego po prostu nie użyjesz 'CGPoint'? – sergio

+0

Rozważałem CGPoint, ale domyśliłem się, że to dla współrzędnych X/Y w ramach UIView, a nie w ramach mojego własnego systemu siatki, więc czy nie nadużywałoby to wartości Core Graphics? Jeśli nie ... to jest trochę bez pytania! – Tim

+0

'CGPoint' jest po prostu strukturą, dzięki czemu można go używać tak, jak lubisz, bez" bałagania "rzeczy w CG. Dobrą rzeczą byłoby "typedef CGPoint MyOwnPointType", aby zachował się jak twój własny typ i uniknął mieszanych zastosowań. – sergio

Odpowiedz

11

Odpowiedź na pytanie "który jest preferowany?" Pytanie zależy od kilku czynników:

  • Ile takich przedmiotów chcesz utworzyć? - Jeśli odpowiedź brzmi "miliony", wygrywa struct; jeśli odpowiedź brzmi "pięćdziesiąt osiem", obiekt wygrywa.
  • Czy chcesz zdefiniować na nim metody? - Jeśli odpowiedź brzmi "tak", obiekt wygrywa; w przeciwnym razie struct może być OK.
  • Czy planujesz zdefiniować tablice? - Jeśli odpowiedź brzmi "tak", lepszym wyborem może być struct.
  • Czy często trzeba je tworzyć i niszczyć? - Jeśli odpowiedź brzmi "tak", lepszym wyborem może być struct.

Ostatecznie ograniczenia projektowe pomagają określić, co jest najlepsze; nie ma struktury danych, która jest ogólnie "lepsza".

+0

Świetna odpowiedź. Będę definiować tablice tych elementów siatki, nie może być ich milionów, ale znacznie więcej niż 100! Sądziłem, że użycie struktury może być bardziej korzystne z perspektywy wydajności. Na podstawie komentarza Sergio zdefiniuję typedef na CGPoint. – Tim

+1

@Tim Ponieważ 'CGPoint' używa' double's i potrzebujesz 'int', uniknęłoby to" poślubienia "tych dwóch i zdefiniowania mojej własnej struktury. Pozwoli ci to uniknąć problemów w przypadkach, gdy uzewnętrzniasz 'struct '(powiedz: zapisz ją do pliku lub wysyłaj przez sieć), ponieważ ochroni cię to przed zmianami, które Apple może chcieć wprowadzić za twoimi plecami. Oczywiście, jeśli to nie ma znaczenia, a twoja struktura reprezentuje punkty w zakresie pasującym do 'CGFloat' tak czy inaczej, możesz ponownie użyć' CGPoint' "hurtowo" bez twojego własnego 'typedef', ponieważ w większości przypadków' typedef' nie zapewnia wystarczającej "izolacji". – dasblinkenlight

+0

Nie jesteś pewien, czy "Czy planujesz zdefiniować tablice?" to dobre pytanie. Obie tablice struktur i tablic obiektów są szeroko stosowane. – Sulthan

1

To jest kompromis.

Klasa i jej instancje będą kosztować więcej w zasobach, zwłaszcza gdy trzeba je wykonać dużo. Jeśli nie będzie tak wielu instancji, nie będzie to problemem.

Struktura jest szybsza, ale trudno ją rozłożyć, a najbardziej niewygodną rzeczą jest to, że struktura nie może pomieścić obiektów ani metody.

Na przykład, jeśli użyjesz go tylko do współrzędnych, sugeruję użycie struct. Ale to zależy od twojego projektu i kodu. Nie ma absolutnego wyroku, który jest najlepszy.

4

Oprócz @dasblinkenlight odpowiedź, dam ci kilka rad decyzji:

  • jest niezmienna struktura po utworzeniu?
    Użyj obiektu.

  • Czy struktura posiada (= zachowuje) wskaźniki do innych obiektów lub tablic (zarówno tablic C, jak i NSArray)? Czy współdziała z obiektami (= ma metody z parametrami obiektu)?
    Następnie użyj obiektu.

  • Czy struktura zawiera tylko prymitywne typy (int, float inne struct s etc) i współpracuje tylko z innymi prymitywów/elemencie?
    Następnie użyj funkcji struct.

+0

Dziękuję, to potwierdza, że ​​struktura jest zdecydowanie tym, co powinienem robić. Chociaż, jeśli byłby niezmienny po stworzeniu, to z pewnością najlepsza jest struktura, a nie obiekt jak wyżej? – Tim

+0

@Tim Nie ma sposobu, aby zapewnić niezmienność "struct", a więc gdy wymagana jest niezmienność, musisz iść na obiekt. – Sulthan

+0

Ach, ok, ma sens. Dzięki. – Tim