2012-08-04 7 views
10

Zauważyłem, że nawet przy przestrzeganiu zasady OOD jednorazowej odpowiedzialności, czasami klasy nadal rosną. Czasami dostęp do zmiennych członków bezpośrednio w metodach przypomina globalny stan i wiele rzeczy istnieje w bieżącym zakresie. Wystarczy spojrzeć na obecnie działającą metodę, nie można już określić, skąd pochodzą zmienne invidiual dostępne w bieżącym zakresie.Czy uzyskać dostęp do zmiennych członków bezpośrednio lub przekazać jako parametr?

Kiedy ostatnio współpracowałem z przyjacielem, zdałem sobie sprawę, że piszę o wiele bardziej szczegółowy kod niż on, ponieważ przekazuję zmienne członkowskie wciąż jako parametry do każdej z metod.

Czy to jest zła praktyka?

edit: Przykład:

class AddNumbers { 
public: 
    int a, b; 
    // ... 
    int addNumbers { 
     // I could have called this without arguments like this: 
     // return internalAlgorithmAddNumbers(); 
     // because the data needed to compute the result is in members. 
     return internalAlgorithmAddNumbers(a,b); 
    } 

private: 
    int internalAlgorithmAddNumbers(int sum1, int sum2) { return sum1+sum2; } 
}; 
+1

Jeśli twoje zajęcia są zbyt duże, podziel je. Jeśli masz zmienną składową, użyj jej. Jeśli nie używasz zmiennych członkowskich w metodzie, prawdopodobnie powinno to być 'static', ale robi to dziwnie. – Flexo

+1

Przepraszam, wydaje mi się, że mam mały problem z twoim angielskim. Przekazujesz zmienne składowe jako parametry? Publiczne zmienne członków? Lub nowe wartości dla tych zmiennych członkowskich? Jestem trochę zdezorientowany. – ATaylor

+0

Przepraszam, że nie było to jasne. Podczas implementacji algorytmu zwykle ponownie analizuję parametry, jakie przyjmuje sygnatura metody, chociaż dane wymagane przez algorytm mogą być w rzeczywistości pobierane bezpośrednio ze zmiennych składowych. Załóżmy, że masz klasę, która dodaje dwie liczby i ma 2 liczby a i b jako zmienne składowe. Wtedy zamiast mieć prywatną metodę dodawania z zerowymi parametrami, nadal definiowałbym funkcję przyjmującą 2 argumenty int. W ten sposób mogłem później ponownie użyć algorytmu również poza klasą. – Tom

Odpowiedz

5

Jeśli klasa ma zmienne składowe, z nich korzystać. Jeśli chcesz jawnie przekazać parametry, uczyń z niego funkcję bezpłatną. Przekazywanie zmiennych członkowskich nie tylko sprawia, że ​​kod jest bardziej szczegółowy, ale także narusza oczekiwania ludzi i sprawia, że ​​kod jest trudny do zrozumienia.

Cały cel klasy polega na utworzeniu zestawu funkcji z niejawnie przekazanym stanem współdzielonym. Jeśli nie jest to tym, co chcesz zrobić, nie używaj klasy.

2

Tak, zdecydowanie zła praktyka. Przekazywanie zmiennej składowej do funkcji składowej nie ma żadnego sensu, z mojego punktu widzenia. Ma kilka wad:

  1. czytelność kodu Zmniejszenie
  2. koszt w perspektywie występów do skopiowania parametru na stosie

Ostatecznie konwertazy metodę prostej funkcji, może mieć sens. W rzeczywistości, z punktu widzenia wydajności, wywołanie funkcji, która nie jest członkiem, jest w rzeczywistości szybsze (nie ma potrzeby dereferencji tego wskaźnika).

EDIT:

odpowiedzi na Twój komentarz. Jeśli funkcja może wykonywać swoje zadanie tylko przy użyciu kilku parametrów przekazanych explicitely i nie potrzebuje żadnego wewnętrznego stanu, prawdopodobnie nie ma powodu, aby deklarować, że ma funkcję składową. Użyj prostego wywołania funkcji w stylu C i przekaż mu parametry.

+0

To jest dokładnie mój punkt w pytaniu. Ponieważ wydaje mi się, że faktycznie zwiększa on czytelność kodu, że żadne magiczne nazwy zewnętrzne nie pojawiają się w twoim lokalnym zasięgu. Dawno temu uczono mnie, że zmienne globalne są bardzo złym stylem, a dostęp do zmiennej członkowskiej czasem wydaje się być jak używanie zmiennych globalnych. Uzyskujesz dostęp do czegoś, co nie jest ani w twoim zasięgu lokalnym, ani przekazywane z zewnątrz jako parametr. – Tom

+1

@Tom - członkowie klasy nie są globalni - celowo jawnie odnoszą się do instancji klasy, z którą pracujesz. Twoja klasa jest hermetyzacją jakiegoś małego, pokrewnego stanu. Jeśli nie, masz większe problemy z projektowaniem, które nie mogą być naprawione w ten sposób. W podanym przeze mnie przykładzie kusiłbym się, by nawet twoje instancje były niezmienne. – Flexo

1

Rozumiem problem, ponieważ musiałem utrzymywać duże klasy kodu, którego początkowo nie pisałem. W C++ mamy słowa kluczowego const pomóc określić metody, które nie zmieniają stanu:

void methodA() const; 

Zastosowanie To pomaga konserwacji, ponieważ możemy zobaczyć, czy metoda może zmienić stan obiektu.

W innych językach, które nie mają tego pojęcia Wolę być jasne, czy mam zmianę stanu zmiennej instancji albo przez posiadające przeszedł w odnośnik lub powrocie zmiana

this->mMemberVariable = this->someMethod(); 

Zamiast tego przez lata odkryłem, że ułatwia to obsługę kodu.

Powiązane problemy