Forum Coders' city Strona Gwna Coders' city
Nasza pasja to programowanie!
 

 PomocPomoc   SzukajSzukaj   UytkownicyUytkownicy   GrupyGrupy  RejestracjaRejestracja 
Archiwum starego forum + teoria    RSS & Panel/SideBar
 ProfilProfil   Zaloguj si, by sprawdzi wiadomociZaloguj si, by sprawdzi wiadomoci   ZalogujZaloguj 

Potrzebuj szybkiej odpowiedzi na moje pytanie... Zasady

Obiektowe modelowanie dziedziny



 
Odpowiedz do tematu    Forum Coders' city Strona Gwna -> Java
Zobacz poprzedni temat :: Zobacz nastpny temat  
Autor Wiadomo
wowo098
Go





PostWysany: Pi Lis 03, 2017 10:45 pm  OP    Temat postu: Obiektowe modelowanie dziedziny Odpowiedz z cytatem Pisownia

Witam,
Wiem, ?e temat jest bardziej oglny, ale umie?ci?em go tutaj, poniewa? programuje w javie i chcia?bym, aby uwzgl?dniono jej "ograniczenia" (np. brak mo?liwo?ci wielodziedziczenia klas).
Zmagam si? z pewnym problemem ju? d?u?sz? chwil? i nie mog? znale?? rozwi?zania, ktre by mnie satysfakcjonowa?o. Problem wygl?da nast?puj?co, mam klas? Osoba. Po klasie Osoba dziedzicz? klasy Wokalista i Gitarzysta. Mo?emy stworzy? obiekty klas Perkusista i Gitarzysta. Bardzo fajnie, ale co w przypadku gdy dana Osoba jest Wokalist? i Gitarzyst? jednocze?nie? Czy istnieje jaki? struktura klas, wzorzec projektowy, ktry by ?adnie oddawa? takie zale?no?ci?
Z gry dzi?kuj? za jakiekolwiek sugestie i pomoc.
Powrt do gry
samolot



Doczy: 26 Sty 2006
Posty: 8376
Skd: Toru?

PostWysany: Pi Lis 03, 2017 11:09 pm      Temat postu: Odpowiedz z cytatem Pisownia

Je?li ?le my?l? to mnie poprawcie. Ja bym w klasie osoba doda? w?a?ciwo?? "Funkcja", ktrej mo?na by nadawa? warto?ci takiego enumeratora, zdefiniowanego wcze?niej:
1-Wokalista
2-Gitarzysta
4-Perkusista
8-Wiol?czelista
16-Skrzypoek
Tworzysz now? klas? typu Osoba i nadajesz jej warto?? w?a?ciwo?ci Funkcja
Przyk?adowo:
- je?li rwn? 3, co b?dzie oznacza?o, ?e ta osoba jest zarwno Wokalista jak i Gitarzyst?
- je?li rwn? 6, co b?dzie oznacza?o, ?e ta osoba jest zarwno Perkusist? jak i Gitarzyst?

_________________
Nie zadawaj bezcelowych pyta? / Windows 8.1 / Windows 10 / VB2008 / VB 2010 / VB 2012 / Pisz poprawnie
Powrt do gry
Zobacz profil autora Wylij prywatn wiadomo Wylij email
wowo098
Go





PostWysany: Pi Lis 03, 2017 11:14 pm  OP(?)    Temat postu: Odpowiedz z cytatem Pisownia

Problem w tym, ?e sama identyfikacja nie wystarcza. Ka?da z klas pochodnych b?dzie mia?a oddzielny zestaw metod.
Powrt do gry
samolot



Doczy: 26 Sty 2006
Posty: 8376
Skd: Toru?

PostWysany: Sob Lis 04, 2017 12:24 am      Temat postu: Odpowiedz z cytatem Pisownia

Klasa pochodna dziedziczy metody "oglne" po klasie bazowej
A specyficzne metody klasy pochodnej implementujesz w klasie pochodnej.

_________________
Nie zadawaj bezcelowych pyta? / Windows 8.1 / Windows 10 / VB2008 / VB 2010 / VB 2012 / Pisz poprawnie
Powrt do gry
Zobacz profil autora Wylij prywatn wiadomo Wylij email
wowo098
Go





PostWysany: Sob Lis 04, 2017 12:59 pm  OP(?)    Temat postu: Odpowiedz z cytatem Pisownia

Dzi?kuj? za pomoc!
Powrt do gry
marcin_an



Doczy: 26 Maj 2005
Posty: 18822

PostWysany: Pi Lis 10, 2017 2:06 am      Temat postu: Odpowiedz z cytatem Pisownia

Ehh... efekt nauczania obiektowo?ci na przyk?adzie "postaci z gier" (tudzie? podobnych) w po??czeniu z podchodzeniem do tworzenia programu od strony literki "M" w MVC.

Zacznij od przemy?lenia, jakie operacje mo?esz wykona? na cz?onkach zespo?u. Czyli jakie metody b?dziesz mia?. Zestawy tych metod maj? by? w interfejsach, nie klasach. Konkretne klasy jedynie implementuj? te metody. Nic ponad to: nie dziedzicz? po innych klasach, nie tworz? mi?dzy sob?hierarchii. Od tego s? interfejsy, ktre mog? dziedziczy? po sobie - tak?e w postaci dziedziczenia po kilku interfejsach jednocze?nie. Zatem nic nie stoi na przeszkodzie, by? mia? interfejs WokalistaGitarzysta.

Nic oprcz... prawie na pewno braku potrzeby tworzenia takiego potworka. Na tej zasadzie mg?by? i?? dalej i tworzy? WokalistaGitarzystaBasista itd. Dla standardowego, 4-instrumentowego zespo?u masz ju?23 mo?liwo?ci. Dla typowej kapeli folk-metalowej z 7 instrumentami masz z 5 tysi?cy opcji i warto?? ta ro?nie bardzo szybko. Nie t?dy droga - i to jest bol?czka, o ktrej napisa?em na pocz?tku.

Nie prbuj robi?kopii ?wiata w swoim programie. Definicje powinny by?zale?ne od tego, jakie metody b?dziesz musia? wywo?ywa? na swoich obiektach. Czy jakikolwiek fragment twojego programu oczekuje, ?e istnieje obiekt, ktry b?dzie musia? by? jednocze?nie wokalist?i gitarzyst?? Czy jest chocia? jedna metoda, ktra przyjmuje jako argument co?, co musi by? wokalist?ORAZ gitarzyst? i wywo?uje metody obydwu*? Je?eli nie, to znaczy, ?e nie potrzebujesz takiego interfejsu.

Mo?esz, oczywi?cie, mie? klas? implementuj?c? obydwa interfejsy. Przyk?adowo:
Kod:
public final class AdamDarski implements Gitarzysta, Wokalista {
    /* ... */
}
Je?eli istnieje potrzeba, by gdzie? tworzy?obiekt, ktry reprezentuje je obydwa - ok.

Lub "prawie ok". O ile bowiem jest to ju?ca?kowicie w porz?dku z punktu widzenia obiektowo?ci, to z praktycznego punktu widzenia b?dzie to droga przez m?k?. Niemniej, je?eli potrzebujesz tego na studia i nauczyciel tak wymaga, to tak rb. Poni?szy fragment dotyczy ju? kwetii praktycznych, nie uczelnianych. Zauwa?y?e?, ?e w grach nie implementuje si?postaci, historii, zdarze?, tekstw, przedmiotw i ca?ej reszty w postaci oddzielnych klas? Tak napisana gra by?aby bardzo trudna do utrzymania, kompilowa?aby si? nie wiadomo ile, by?aby niewydajna z punktu widzenia u?ywanej pami?ci, wymaga?aby umiej?tno?ci programowania przez osoby odpowiedzialne za tematy nieprogramistyczne i by?aby trudniejsza w aktualizacji. Rozdziela si? faktyczne dane od kodu, a je?li nawet ju?co? jest w kodzie, to postaraj si? tego u?y? wielokrotnie i umo?liwi? wykorzystanie w miejscach, ktrych mo?e nawet teraz jeszcze nie widzisz. W tym przypadku to, czego chcesz, to mo?liwo?? utworzenia obiektu, ktry dane b?dzie dostawa? z zewn?trz (np. z jakiego? pliku konfiguracjnego), a zachowanie b?dzie realizowane np. przez wzorzec dekoratora.

samolot:
Mia?o by? obiektowe. To, co zaproponowa?e?, jest sprzeczne z podstawami obiektowo?ci i uniemo?liwi wowo098-owi faktyczne wykorzystanie tak zbudowanych klas w ?rodowisku obiektowym.
____
* Ewentualnie istnieje pole klasy, ktre odnosi si? do takiego czego?.

_________________
Nieaktywny od 2017-04-01
Powrt do gry
Zobacz profil autora Wylij prywatn wiadomo
samolot



Doczy: 26 Sty 2006
Posty: 8376
Skd: Toru?

PostWysany: Sob Lis 11, 2017 12:29 am      Temat postu: Odpowiedz z cytatem Pisownia

Samolot napisa:
Je?li ?le my?l? to mnie poprawcie

I niestety, nie jestem "zawodowcem" w tej dziedzinie, mo?e niepotrzebnie wi?c mieszam. Szkoda, ?e tak rzadko tu teraz zagl?dasz, bo twoj? wiedz? zawsze tu wszyscy wysoko cenili. Ja tu jeszcze troch? sprz?tam, ale ciemno?? widz?.

_________________
Nie zadawaj bezcelowych pyta? / Windows 8.1 / Windows 10 / VB2008 / VB 2010 / VB 2012 / Pisz poprawnie
Powrt do gry
Zobacz profil autora Wylij prywatn wiadomo Wylij email
marcin_an



Doczy: 26 Maj 2005
Posty: 18822

PostWysany: Czw Lis 16, 2017 8:20 am      Temat postu: Odpowiedz z cytatem Pisownia

Przepraszam, nie mia?em zamiaru ci?zruga?. Mo?e powinienemby? bardziej rozwin?? tamt? wypowied?, co te? zrobi?.

Pomijaj?c na chwil? sensowno??takiego podej?cia (o tym dalej), zauwa? jedn? rzecz. W zaproponowanym rozwi?zaniu faktycznie jeste? w stanie rozr?ni? r?nych muzykw: mie? wokalist?, perkusist?, skrzypko-wokalist? itp. Ale nie mo?esz w ?aden sposb spo?ytkowa? tej informacji. Wszystkie obiekty b?d? mia?y bowiem dok?adnie ten sam zestaw metod. Tutaj s? dwie opcje: znale?? najmniejsz? cz??? wspln? albo u?y? sumy wszystkich mo?liwo?ci. Pierwsze oznacza, ?e nie b?dzie ?adnych metod "muzycznych", czyli obiekty b?d? bezu?yteczne. Drugie jest jeszcze gorsz? sytuacj?: wi?kszo??metod jest obecna, ale w rzeczywisto?ci nie dzia?aj?, bo dla danej osoby nie maj?sensu.

Wracaj?c teraz do obiektowo?ci: jedn? z g?wnych zalet podej?cia obiektowego jest uniezale?nienie od siebie elementw programu, swobodne zmienianie ich implementacji bez wp?ywu na reszt? programu oraz mo?liwo?? nieograniczonego dodawania nowych implementacji. U?ycie rozwi?zania takie, jakie zaproponowa?e?, stoi w sprzeczno?ci z tymi tematami.

Nie mo?esz dodawa? ile chcesz nowych implementacji, bo ka?da musi mie? przyporz?dkowany bit w zestawie flag, okre?laj?cym jej typ. W zale?no?ci od sytuacji, j?zyka i mo?liwo?ci, liczba bitw jest zwykle ograniczona do czego?pomi?dzy 32 a 128. Typowo: 64. Mo?na u?ywa? kilku zmiennych, ale chyba zaczynasz ju? czu?, ?e jest to tylko uciekanie od problemu, ktre nie jest te? pozbawione kosztw. A je?li dzisiaj nie widzisz mo?liwo?ci utworzenia 64 r?nych muzykw, to podpowiem, ?e w hitorii informatyki niedoszacowanie mo?liwej liczby opcji jest powszechne. Nie szukaj?c daleko: w X11 (najpopularniejszy system okien) na uk?ad klawiatury przeznaczono 2 bity, bo uznano, ?e 4 uk?ady klawiatury wystarcz? ka?demu. Je?li nawet mimo tego 64 wydaje si?du?? liczb? dla czego? opisuj?cego zesp? muzyczny, to przypomn? o dwch innych rzeczach. Pierwsze: w in?ynierii zachowuje si?pewien zapas "na wszelki wypadek". Drugie: w czasie rozwoju programu na przestrzeni wielu lat powstan? alternatywne implementacje tych samych muzykw. Po uwzgl?dnieniu powy?szego okazuje si?, ?e 64-bitowa ma du?o mniejsz?"pojemno??": mo?e nawet rz?du 4-8 muzykw.

?eby doda? taki nowy identyfikator, trzeba poprawi? ka?dy fragment kodu, ktry b?dzie si?do niego dotyka?. Nie mo?esz po prostu doda? warto?ci 32 dla flecisty. Nie, ca?y program musi wiedzie?, co oznacza to 32. W przypadku identyfikatorw w postaci flag, takich jak zaproponowane przez ciebie, jest jeszcze o tyle dobrze, ?e w niektrych sytuacjach mo?na zignorowa? nieznane warto?ci i program si? nie posypie. Ale to tylko ograniczenie skutkw problemu, a nie jego wyeliminowanie. A problem jest znacz?cy. W projekcie, nad ktrym pracuje ca?y zesp? ludzi, zsynchronizowanie ich pracy i zagwarantowanie spjno?ci takich rzeczy wymaga sporego wysi?ku. Nawet je?eli pracuje si?samodzielnie, to nadal jest to kupa roboty, konieczno?? przekompilowania sporej cz??ci programu i przetestowania jej - w tym napisania testw, ktre nie b?d? s?u?y?y niczemu innemu oprcz sprawdzeniu w?a?nie dzia?ania tej jednej warto?ci. Porwnuj?c to do podej?cia obiektowego, gdzie jeden programista po prostu dodaje sobie klas? i nie wp?ywa to na nic innego, jest to potworne marnowanie zasobw.

I, ostatnie, niezale?no?? r?nych cz??ci programu. Cz??ciowo poruszy?em to ju? w poprzednim paragrafie, ale tutaj podejd? do tego od strony bardziej formalnej. Istnieje co?, co nazywa si? Liskov substitution principle. Po polsku: "zasada podstawienia Liskov", ale nie polecam definicji zawartej na polskiej Wikipedii. W skrcie* mwi ona, ?e je?eli mamy dwa typy T i U, gdzie U jest podtypem T, oraz mamy kod u?ywaj?cy obiektw typu T, to kod ten musi dzia?a? - bez ?adnych zmian - tak?e dla obiektw typu U. Przyk?adowo: mamy typ Zwierz? oraz typy Pies, Kot, Ko? i Wieloryb. Mamy kod, ktry robi co? na obiektach typu Zwierz?: np. maluje je ca?e pomara?czowo. Do kodu tego mo?emy podstawi? Pies, Kot, Ko? albo Wieloryb i dla tego kodu nie powinno mie? ?adnego znaczenia, jakie zwierze faktycznie dosta?: ka?de ma pomalowa? na pomara?czowo. I je?li przyjdzie mi do g?owy za rok, ?eby stworzy?typ Biedronka, to kod ten powinien pomalowa? biedronk? na pomara?czowo bez zaj?kni?cia. Jak sam zapewne zauwa?asz, u?ywanie rozwi?zania z flagami przeczy tej regule.

Niezale?no?? r?nych cz??ci programu jest te? ograniczona faktem, ?e musi istnie? centralny "rejestr" tych warto?ci. Czy to b?dzie typ wyliczeniowy, jaka? lista, czy nawet kawa?ek papieru na biurku ka?dego programisty, jest to co?, co niepotrzebnie spina ze sob? rzeczy, ktre powinny by? oddzielne.

____
* Formalna definicja jest bardziej precyzyjna i mniej zale?na od konkretnego j?zyka programowania. Tutaj przyj??em form? uproszczon?, pasuj?c? do praktycznego jej zastosowania w j?zykach obiektowych w stylu C++, C# czy Javy.

_________________
Nieaktywny od 2017-04-01
Powrt do gry
Zobacz profil autora Wylij prywatn wiadomo
samolot



Doczy: 26 Sty 2006
Posty: 8376
Skd: Toru?

PostWysany: Czw Lis 16, 2017 10:55 pm      Temat postu: Odpowiedz z cytatem Pisownia

Z t? obiektowo?ci? jest tak, ?e w?a?ciwie ja j? rozumiem, ale trudno j? stosowa? "od razu", bo to wymaga dok?adnej analizy problemu pod wzgl?dem obiektowo?ci. Widz?, ?e paln??em g?upstwo, ale liczy?em w?a?nie na tak? wypowied? jak twoja.
Poza tym uwa?am, ?e nigdy nie jest tak, ?e implementuje si? dla problemu od razu gotowe, bezb??dne, niezale?ne obiekty, ktre s? od razu w ka?dym wzgl?dzie doskona?e. Tworzy si? raczej co? zbli?onego, a p?niej si? to poprawia i udoskonala. Oczywi?cie dog??bne przemy?lenie problemu na pocz?tku pomaga wystartowa? z lepsz? jako?ci? obiektw, ale zawsze jest to proces dochodzenia do pe?nej obiektowo?ci.


'

_________________
Nie zadawaj bezcelowych pyta? / Windows 8.1 / Windows 10 / VB2008 / VB 2010 / VB 2012 / Pisz poprawnie
Powrt do gry
Zobacz profil autora Wylij prywatn wiadomo Wylij email
Wywietl posty z ostatnich:   
Odpowiedz do tematu    Forum Coders' city Strona Gwna -> Java Wszystkie czasy w strefie CET (Europa)

Strona 1 z 1

 
Skocz do:  
Moesz pisa nowe tematy
Moesz odpowiada w tematach
Nie moesz zmienia swoich postw
Nie moesz usuwa swoich postw
Nie moesz gosowa w ankietach
Moesz dodawa zaczniki na tym forum
Moesz pobiera pliki z tego forum




Debug: strone wygenerowano w 0.24518 sekund, zapytan = 11
contact

| Darmowe programy i porady Jelcyna | Tansze zakupy w Helionie | MS Office Blog |