Wpis z mikrobloga

#programowanie Mirki, mam taką zagwozdkę, piszę projekt, mam pewną klasę, której obiekty mają mieć różne zachowanie, zależnie od tego co sobie wybierze użytkownik. Jak teraz zaprojektować to tak, żeby dla każdej nowej funkcjonalności nie tworzyć osobnej klasy, która by rozszerzała te główną.
  • 8
@D3xxT3r: Tak to opisałeś, że nie wiem czy piszesz symulator lotu, system bankowy, czy wirusa :) Zależy od kontekstu. Opisz więcej to więcej Ci pomogę.

Po pierwsze - różne obiekty tej samej klasy mają mieć różne zachowania? To czemu nie zrobić różnych klas po prostu? Jak chcesz mieć to w jednej klasie to możesz skorzystać z kompozycji.

Czyli jeśli Twoja klasa może mieć różne zachowania w 3 miejscach, a reszta zachowań
@D3xxT3r: Jak juz wyzej wspomnieli - zależy co to jest. Może trzeba zmienić podejście i to użytkownik ma sobie 'wyklikać' zachowanie a Ty wrzucisz do klasy, która to obsłuży. Ewentualnie jakiś plik konfiguracyjny który zdefiniuje zachowania, i wtedy nie trzeba grzebać w kodzie, dodajesz do pliku/bazy, zaczytujesz na starcie i finito- obie opcje mocno ograniczają swobode, której możesz potrzebować
mam pewną klasę, której obiekty mają mieć różne zachowanie, zależnie od tego co sobie wybierze użytkownik


@D3xxT3r: Jak chcesz obiektowo (polimorfizm) to powinieneś mieć typ (interface/abstract class), którego klasy mają różne zachowanie... to, co wybrał użytkownik jest zamieniane na konkretną implementację i komponowane z innymi obiektami w fabryce. Dzięki temu usuwasz rozgałęzienia z kodu aplikacji.
@tell_me_more @Smevios nie chciałbym tego robić po stronie bazy, ale przyjmując, że np użytkownik tworzy sobie taki ficzer i wybiera co chce tam mieć np nowy użytkownik sobie tworzy samochód i dodaje jakie bajery chce mieć w nim. Czy da się uniknąć tworzenia osobnej klasy dla każdego bajeru (bo jeśli zastosuje tu kompozycje to tak bym własnie musiał zrobić)? Czy lepiej jednak zrealizować to mimo wszystko przez kompozycje?
@D3xxT3r: czym te bajery mają się różnic między sobą? Jeśli tylko parametrami, to możesz mieć oddzielną klasę na kategorię bajerów (Spoiler, Turbo, SkładanyDach, Alufelgi, ...), a w ramach kategorii możesz mieć wiele różnych spoilerów różniących się np wagą, oporem powietrza i siłą docisku. I te parametry wczytujesz np z plików konfiguracyjnych, i robisz 5 instancji klasy Spoiler z różnymi waartościami pól waga, opór powietrza, silaDocisku, i dodajesz do klasy Samochód ten