Thread View: pl.comp.objects
1 messages
1 total messages
Started by kkoniec@mks.com.
Tue, 15 Sep 2009 16:10
pl.comp.objects FAQ (Frequently Asked Questions and more)
Author: kkoniec@mks.com.
Date: Tue, 15 Sep 2009 16:10
Date: Tue, 15 Sep 2009 16:10
692 lines
25779 bytes
25779 bytes
Posted-By: auto-faq 3.1.1.2 Archive-name: pl-comp-objects-faq --------------------------------------------------------------------------- Zawartosc: pl.comp.objects FAQ (Frequently Asked Questions and Summary) Data: 1998.08.18 Wersja: 3.2 Autorzy: Kuba Chabik Kamil Konieczny kkoniec@mks.com.pl --------------------------------------------------------------------------- Wykorzystane materialy: poprzednia (druga) edycja FAQ, opracowana przez Maciej "MACiAS" Pilichowski, macias@vm.cc.uni.torun.pl Data opracowania: 2.05.95 - 16.05.95 Zasoby: 6.12.94 - 12.04.95 ------- Uwagi: [ts 2005.12.27] To FAQ jest juz tak stare, ze chyba az przestarzale. Ale dopoki ktos nie wymysli nowego, to z braku innego bedzie wysylane nadal. Moze ktos sie zlituje i napisze/poprawi? [Kamil 1998.06.24]: Ze wzgledu na brak czasu edycja trzecia to glownie reorganizacja i poprawienie poprzedniej edycji, autorstwa [MACiAS]. W miare wolnego czasu bede dodawal nowe tematy, zaczynajac od biezacych listow az do zamierzchlej przeszlosci, czyli od roku 1998 do 1995. Nie beda dodawane tematy, nie majace nic (albo niewiele) wspolnego z tematyka grupy. Postaram sie rowniez o usuwanie z archiwow listy spamow, jak rowniez nieaktualnych ogloszen zwiazanych z obiektami. [MACiAS 1995.05.16]: W znakomitej wiekszosci wszystkie informacje zostaly wziete z listow uczestnikow grupy. Jesli zauwazycie ponizej bledy, niescislosci, luki, etc. to bardzo prosze o listy (jesli sprawa nie jest oczywista, to najlepiej na adres grupy). ------- Krotki spis tematow: T.1 Informacje ogolne (literatura, slowniczek, pojecia). T.2 Jezyk C++. T.3 Jezyk Smaltalk. T.4 Inne ------- Spis tematow: T.1.1 Literatura. T.1.1.1 Literatura w jezyku angielskim. T.1.1.2 Literatura w jezyku polskim. T.1.2 Proponowany maly slownik terminow. T.1.3 Co to jest klasa? T.1.4 Co to jest metoda? T.1.5 Co to jest atrybut? T.1.6 Co reprezentuje dziedziczenie? T.1.7 Co to jest polimorfizm? T.1.8 Co zyskujemy przez polimorfizm? T.1.9 Do czego potrzebna jest hermetyzacja? T.1.10 Co to jest klasa abstrakcyjna? T.1.11 Co to jest metaklasa? T.1.12 Co to jest komponent? T.1.13 Co to sa obiektowe bazy danych? T.1.14 Czy obiektowe bazy danych sa gorsze od relacyjnych? T.1.15 Co to jest CORBA? T.1.16 Czy programy obiektowe sa wolniejsze od proceduralnych? T.2.1 Jak w prosty sposob zrozumiec opis bledu w BC++? T.2.2 Co zrobic jesli klasa deklarowana w pliku naglowkowym uzywa typow T.2.3 Co to sa dziwne pliki w katalogu "/usr/g++-include/gen" z T.2.4 Jak w C++ obsluguje sie funkcje ze zmienna liczba parametrow? T.2.5 Czy mozna zaimplementowac funkcje wirtualne w C? T.2.6 Czy stosowanie zaprzyjazniania klas nalezy do dobrej praktyki T.2.7 Gdzie mozna dostac gramatyke C++ (obojetnie dla jakiego narzedzia, T.2.8 Czy przejscie do OOP wymaga odrzucenia "balastu proceduralnego"? T.2.9 Co to jest konstruktor kopiujacy? T.2.10 Czy istnieje domyslny konstruktor kopiujacy? T.2.11 Jak uniknac dolaczania metod wirtualnych, z ktorych nie korzystam, a T.2.12 Ciekawostki z historii C++. T.2.13 Stosowac wskaznik czy referencje? T.2.14 Co to sa sprytne wskazniki (smart pointers)? T.2.15 Czy wszystkie metody w mojej klasie powinny byc wirtualne? T.2.16 Czy konstruktory moga byc wirtualne? T.2.17 Jak tworzyc klasy abstrakcyjne? T.3.1 Czy jest dostepna darmowa implementacja Smalltalka? T.3.2 Czy SmallTalk jest dobry w praktyce, czy tylko w teorii? T.3.3 Gdzie mozna dowiedziec sie o jezyku Smalltalk i jego zastosowaniach? T.4.1 Jak powinienem zabrac sie za programowanie obiektowe? T.4.2 Czy OOP oznacza brak optymalizacji? T.4.3 Jak rozpoznawac, czy dany program lub projekt jest dobry ? T.4.4 Poszukuje informacji na temat rozszerzen do jezykow obiektowych --------------------------------------------------------------------------- ------- T.1.1 Literatura. T.1.1.1 Literatura w jezyku angielskim. Badouin-Lafon M., "Object-Oriented Languages" wyd ?, ISBN ? Brown W.H., Malveau R.C., McCormick H.W. III, Mowbray T.J., "AntiPatterns: Refactoring Software, Architectures, and Projects in Crisis." John Wiley & Sons, ISBN 0-471-19713-0 Buchmann et al., "A System of Patterns" John Wiley & Sons, ISBN 0-471-95869-7 Budd, T., "An Introduction to Object Oriented Programming", Addison Wesley Publishing, ISBN 0-201-54709-0 Coleman D., et al, "The Fusion Method" wyd ?, ISBN ? Fowler M., Scott K., "UML Distilled" Addison-Wesley, ISBN 0-201-32563-2 Gamma E., Helm R., Johnson R., Vlissides J. "Design Patterns" Addison-Wesley, ISBN 0-201-63361-2 Graham I., "Object-Oriented Methods" 2nd ed. Addison-Wesley, ISBN 0-201-59371-8 http://www2.awl.com/cseng/ Jacobson I., Christerson M., Johnsson P., Overgaard G., "Object-Oriented Software Engineering" Addison-Wesley, ISBN 0-201-54435-0 Lakos J., "Large-Scale C++ Software Design" Addison-Wesley, ISBN 0-201-63362-0 Lalonde W.R., Pugh J.R., "Inside Smalltalk", Volume 1 and 2, Prentice Hall, ISBN ? Rumbaugh J., Blaha M., Premerlani W.,Eddy F.,Lorensen W., "Object-Oriented Modelling and Design" Prentince Hall, ISBN ? Stroustrup B., "The C++ Programming Language" 3rd. ed., 6th printing Addison-Wesley, ISBN 0-201-88954-4 http://www.research.att.com/~bs/homepage.html T.1.1.2 Literatura w jezyku polskim. Barteczko K., "Praktyczne wprowadzenie do programowania w jezyku C++", LUPUS, ISBN ISBN 83-85545-13-1 Coad P., Yourdon E., "Analiza obiektowa" (OOA), README, ISBN 83-85769-17-X Coad P., Yourdon E., "Projektowanie obiektowe" (OOD), README, ISBN 83-85769-18-8 Coad P., Nicola J., "Programowanie obiektowe" (OOP), README, ISBN 83-85769-16-1 Grebosz J., grebosz@bron.ifj.edu.pl, "Symfonia C++" Oficyna Kallimach, ISBN 83-901689-0-1 wydanie 3, Oficyna Kallimach, ISBN 83-901689-1-X Grebosz J., "Pasja C++" Oficyna Kallimach, ISBN 83-901689-2-8 Hansen T., "Zadania z jezyka C++", WNT, ISBN 83-204-1759-7 Kliszewski M., "Inzynieria oprogramowania obiektowego - analiza obiektowa", RESPEKT, ISBN 83-901994-0-8 Kain E., "Od C do C++" wyd ?, ISBN ? Lippman S.B., "Podstawy jezyka C++", Tlumaczenie z wydania 2, WNT, ISBN 83-204-1681-7 Martin J., Odell J.J., "Podstawy metod obiektowych" WNT, ISBN 83-204-2116-0 Stroustrup B., "Jezyk C++", Tlumaczenie wydania 2, WNT, ISBN 83-204-1697-3 Stroustrup B., "Projektowanie i rozwoj jezyka C++", WNT, ISBN 83-204-2042-3 ------- T.1.2 Proponowany maly slownik terminow. garbage collector - odsmiecacz operator overloading - przeciazanie operatora object persistency - trwanie obiektu persistent pointer - trwaly wskaznik container - pojemnik template - szablon reference - odnosnik dereferencing - wyluskiwanie ----- T.1.3 Co to jest klasa? Klasa jest abstrakcja obiektow z modelowanej dziedziny. Stanowi wzorzec, opis, z ktorego te obiekty beda tworzone. Klasa nic nie "robi", klasa czyms "jest". Klasy odwzorowuja przedmioty, osoby, a takze organizacje i procesy zachodzace w swiecie rzeczywistym. Klasa posiada jakas odpowiedzialnosc. Cos, dla czego nie potrafisz wskazac odpowiedzialnosci, klasa nie jest (najprawdodobniej jest jedyniem atrybutem innej klasy). ----- T.1.4 Co to jest metoda? Metoda, zwana takze operacja, reprezentuje czynnosc, jaka moze byc wykonana przez dany obiekt w swiecie rzeczywistym. Metody moga uzywane do uzyskania informacji lub do zmiany stanu danego obiektu. ----- T.1.5 Co to jest atrybut? Atrybut to cecha obiektu, na przyklad kolor pojazdu, dlugosc tekstu, wzrost osoby. Atrybuty sa innymi obiektami zagniezdzonymi w danym obiekcie. ----- T.1.6 Co reprezentuje dziedziczenie? Dziedziczenie reprezentuje specjalizacje. Mowimy, ze klasa dziedziczaca (subclass) "jest rodzaju" klasy bazowej (superclass). Innymi slowy, klasa bazowa reprezentuje pojecie bardziej ogolne, niz klasa dziedziczaca. ----- T.1.7 Co to jest polimorfizm? Metody polimorficzne to takie, ktore moga zachowywac sie roznie, w zaleznosci od tego, na rzecz jakiego konkretnego obiektu zostaly wywolane. Metode polimorficzna mozemy przedefiniowac w klasie implementujacej interfejs (czyli, najczesciej, dziedziczacej). Jezeli teraz inne obiekty beda wywolywac te metode dla obiektow nowej klasy, to bedzie wykonywala sie nowo, a nie stara metoda, choc same obiekty wolajace nie zauwaza zmiany. ----- T.1.8 Co zyskujemy przez polimorfizm? Dzieki polimorfizmowi uzyskujemy elastycznosc systemow, bowiem mozemy modyfikowac jedynie to, co rzeczywiscie nalezy zmienic, nie zas cale "otoczenie" konkretnej metody ----- T.1.9 Do czego potrzebna jest hermetyzacja? Hermetyzacja, czyli ukrywanie metod i atrybutow klas, daje nam bezpieczenstwo i przejrzystosc. Przypuscmy, ze mamy atrybut "godzinaRozpoczecia" klasy "Wyklad". Gdyby wszyscy mieli dostep do takiego atrybutu, mogloby sie zdarzyc, ze ktos ustawilby ja na liczbe wieksza od 23, co oczywiscie nie ma sensu. Jednakze dzieki hermetyzacji mozemy taka kontrole poprawnosci zawrzec w metodzie "zmienGodzineRozpoczecia" i odmowic ustawienia nieprawidlowej godziny. ----- T.1.10 Co to jest klasa abstrakcyjna? To taka klasa, ktora mozna tylko wykorzystywac przez dziedziczenie od niej, a nie mozna tworzyc jej obiektow. Klasy abstrakcyjne reprezentuja pojecia, ktore sa generalizacja innych pojec, ale same w sobie nie reprezentuja zadnych obiektow w dziedzinie. ----- T.1.11 Co to jest metaklasa? Metaklasa to jakby klasa dla klasy, innymi slowy, egzemplarze (instance) metaklas sa klasami. Metaklasy wystepuja nie we wszystkich jezykach programowania, a nawet w tych, w ktorych wystepuja, trudno wskazac ich konkretne, programistyczne zastosowanie. Jednakze czesto stosuje sie jej nawet o tym nie wiedzac. ----- T.1.12 Co to jest komponent? Komponent to grupa klas, ktore sluza jednemu, konkretnemu celowi. Klasy w komponencie charakteryzuja sie tym, ze maja silne powiazania z innymi klasami wewnatrz tego samego komponentu i slabe poza nim. Dzieki temu komponent moga byc rozwijane niezaleznie i podmieniane w razie potrzeby, bez modyfikacji innych komponentow. Przykladem komponentu moglaby byc grupa klas odpowiedzialna za obsluge wydruku. ----- T.1.13 Co to sa obiektowe bazy danych? Pojecie "bazy danych" nie jest szczegolnie szczesliwe. Lepiej mowic o "obiektach trwalych". Systemy takie pozwalaja na przechowanie stanu obiektu pomiedzy wywolaniami aplikacji, czyli tak, jak tradycyjna baza danych przechowuje dane. Jednakze roznica miedzy nimi a takimi bazami polega na fakcie, ze nie trzeba programowo odtwarzac stanu aplikacji z bazy (np. zapytaniami SQL). Po prostu obiekty aplikacji i obiekty bazy danych to to samo. ----- T.1.14 Czy obiektowe bazy danych sa gorsze od relacyjnych? To zalezy do czego. W przypadku odwzorowywania skomplikowanych zaleznosci sa o niebo lepsze. W przypadku plaskich, kartotekowych danych sa gorsze. Technologia ODBMS jest niewatpliwie mniej dojrzala od RDBMS, jednakze swoj okres "dzieciecy" ma juz na pewno za soba. ----- T.1.15 Co to jest CORBA? CORBA to skrot od Common Object Request Broker Architecture. Jest to architektura, ktore umozliwia komunikacje obiektom zlokalizowanym na roznych maszynach, roznych systemach operacyjnych, roznych architekturach sprzetowych komunikacje miedzy soba. W ramach standardu CORBA istnieja takze uslugi (CORBA services), np. kolekcje, zdarzenia (events), transakcje i inne. CORBA jest bardzo potezna architektura, ale nie ma zbyt dobrych implementacji, szczegolnie uslug. Ponadto organizacja OMG, ktora zdefiniowala CORBA'e, jest cialem biurokratycznym i nieruchawym. Spowalnia to rozwoj tego standardu. ----- T.1.16 Czy programy obiektowe sa wolniejsze od proceduralnych? Nie, to kompletna bzdura. Programowanie obiektowe pozwala na zastosowanie takich technik, ktore czynia program bezpieczniejszym, stabilniejszym, szybszym i bardziej elastycznym. Ponadto, technologia obiektowa pozwala tworzyc system w sposob bardziej rygorystyczny, a wiec pewniejszy i bardziej skoordynowany, niz technologia proceduralna. Skutkiem jest generalnie wyzsza jakosc systemow, szczegolnie tych powazniejszych, a wiec i wieksza szybkosc ich dzialania. Opinie taka programy obiektowe zawdzieczaja niedouczonym programistom, ktorzy, liznawszy odrobiny C++, poczuli sie ekspertami od obiektow i wyglaszali na prawo i lewo podobne bzdury. --------------------------------------------------------------------------- ----- T.2.1 Jak w prosty sposob zrozumiec opis bledu w BC++? Przeczytac opis bledu, zajrzec do "Programmer's Manual", "Programmer's Reference", podrecznika C++. Jesli nie pomoze, skontaktowac sie z innymi osobami piszacymi w C++. ----- T.2.2 Co zrobic jesli klasa deklarowana w pliku naglowkowym uzywa typow deklarowanych w innych plikach naglowkowych? W _kazdym_ pliku naglowkowym nalezy wpisac: #ifndef nazwapliku_h #define nazwapliku_h .. #endif I mozesz bezkarnie wlaczac potrzebne ci headery. ----- T.2.3 Co to sa dziwne pliki w katalogu "/usr/g++-include/gen" z roszerzeniami ".ccP" oraz ".hP"? Jest to po prostu biblioteka "libg++". Dowiedziec sie czegos wiecej mozesz z dokumentacji. A pliki z rozszerzeniem ".ccP" i ".hP" sa wejsciowymy plikami do programu "genclass". To sa pliki ze starej wersji kompilatora, ktory nie mial wlaczonych templates, wiec uzywalo sie tego i "genclass" specyfikujac jaki mial byc bazowy typ, "genclass" tworzyl z tego pliki np. "<type>Vec.cc" i "<type>Vec.h" zastepujac <T> podanym typem. ----- T.2.4 Jak w C++ obsluguje sie funkcje ze zmienna liczba parametrow? W starym C stosowalo sie <varargs.h>, w nowym (ANSI C oraz C++) stosuje sie <stdarg.h>. Ponizej przyklad programu wykorzystujacy <stdarg.h>. va_list - typ zmiennej pomocniczej va_start - inicjalizacja listy va_argptr - przesuniecie wskaznika listy na nastepny element #include <stdio.h> #include <stdarg.h> void pisz(char *tekst,...) { va_list argptr; va_start(argptr,tekst); printf("\nTo sa dane : %s",tekst); while(*(tekst=va_arg(argptr,char *))!=NULL) printf(" %s",tekst); va_end(argptr); }; void main() { pisz("ala","ola","kot","domek na prerii","i nic",NULL); }; Typowo to jest tak, ze pierwszy parametr zawiera informacje o liczbie dalszych parametrow. Moze to byc liczba, ale moze byc tak jak w "printf": printf("zmienna %s = %d",...) Tu jest podane, ze tylko dwoch parametrow trzeba sie doszukac. ----- T.2.5 Czy mozna zaimplementowac funkcje wirtualne w C? Tak - mozna to zrobic poprzez umieszczenie wskaznikow do funkcji razem z danymi, np: struct ojciec { int daneojca; int *funkcjaWirtualna(char *arg); }; struct syn { struct ojciec o; int danesyna; int *mojaFunkcjaWirtualna(); }; struct syn *konstuktor_syna() { struct syn *s = malloc(...); s->mojaFunkcjaWirtualna = syn_mojaFunkcja; s->o.funkcjaWirtualna = s->mojaFunkcjaWirtualna; // podmiana wskaznika // funkcji wirtualnej } czyli poprzez podmiane wskaznika do funkcji. Taka realizacja jednak umozliwa jednak uzywanie tylko pseudo-wirtualnych funkcji. Jesli chcemy uzywac naprawde takich funkcji uzyjmy jezyka obiektowego, gdyz w tych jezykach funkcja/metoda wirtualna wyroznia sie tym, ze niezaleznie od sposobu wywolania zawsze wykonana zostanie funkcja odpowiadajaca rzeczywistemu typowi klasy. Tak jak w ponizszym przykladzie: foobar( struct ojciec *o) { o->mojaFunkcjaWirtualna(); // jesli o jest wskaznikiem na syna // to wywolane zostanie syn_mojaFunkcja } ----- T.2.6 Czy stosowanie zaprzyjazniania klas nalezy do dobrej praktyki programisty? Nie, gdyz dopuszcza do latwego dostepu do pol prywatnych i chronionych. Narusza to zasade "jedyna aktywnosc systemu obiektowego to przekazywanie wiadomosci (message passing)". Istnieje roznica miedzy zapisaniem "kolo->radius=5;", a "kolo->setRadius(5);". ----- T.2.7 Gdzie mozna dostac gramatyke C++ (obojetnie dla jakiego narzedzia, preferowane yacc(bison), lex(flex) itp), ale koniecznie AT&T 2.0 (glownie chodzi o nested classes oraz templates)? Powinna byc w zrodlach GNU cc. Jest rowniez w B.Stroustrup "The C++ Programming Language", 3rd ed., Appendix A (niekompletna). ----- T.2.8 Czy przejscie do OOP wymaga odrzucenia "balastu proceduralnego"? Wczytujac sie w Stroustrupa "Jezyk C++" mozna zauwazyc jego slowa: nowe techniki programowania nie neguja starych - uzupelniaja je. To nie rewolucja. Tam gdzie wystarcza procedury lub moduly, nie szukamy obiektow. [czy ktos moze znalezc nr rozdzialu i paragrafu, lub nr strony ? Kamil] ----- T.2.9 Co to jest konstruktor kopiujacy? Konstruktor kopiujacy jest bardzo podobny do operatora przypisania, tyle ze o ile operator przypisania uzywany jest dla obiektow juz istniejacych, to konstruktor kopiujacy gdy tworzymy nowy obiekt i jednoczesnie nadajemy mu jakas wartosc. Przyklad (bo bez przykladu raczej malo kto zrozumie :-) ): class A { private: int data; public: A(int new_data=0) : data(new_data) {}; // To jest zwykly // konstruktor A( A& a ) : data(a.data) {}; // A to konstruktor kopiujacy A& operator=(A &a) { data=a.data; return *this; } // a to // operator przypisania }; I teraz... main() { A a(1); // Tu zostanie wywolany zwykly konstruktor, z argumentem 1 A b; // Podbnie, tyle ze argument zostanie domyslnie // przyjety jako 0 A c=b; // Tutaj konstruktor kopiujacy z argumentem b A d; // A tutaj operator przypisania z tym samym argumentem d=b; }; Najwazniejsze w tym wszystkim sa ostatnie trzy linijki, bo tutaj wlasnie widac roznice, kiedy wywolywany jest operator przypisania, a kiedy konstruktor kopiujacy. Konstruktor kopiujacy jest tylko i wylacznie wtedy gdy przypisanie nastepuje rownoczesnie z utworzeniem. Dlaczego to wyroznienie? Pozwala to zaoszczedzic operacji, bo oczywiscie moglo by byc i tak ze kazda instrukcja typu "A b=c;" bylaby rozbijana na dwie: "A b; b=c;". Ale wtedy niepotrzebnie obiekt "b" bylby dwa razy inicjowany (w naszym przypadku najpierw "data=0", a potem "data=c.data"). Taka instrukcja jak "A b=c;" jest rownowazna po prostu "A b(c);" a nie (jak mogloby sie wydawac) parze instrukcji "A b; b=c;". Ponizsze przyklady takze sa ciekawe: class klasaA { public: klasaA metoda() { return (*this); }; ... }; Tutaj zostanie najpierw wykonana kopia obiektu (poprzez wywolanie kostruktora kopiujacego) i kopia zostanie zwrocona jako wynik metody; Trzeba bardzo uwazac na brak znaczku referencji "&"!!! class klasaA { public: klasaA& metoda() { klasaA temp; .... return temp; }; .... }; Poniewaz "temp" jest obiektem o czasie zycia tylko wewnatrz metody, wiec by moc zwrocic referencje do niego trzeba miec kopie o zasiegu wiekszym. Kopilator wiec wola konstruktor kopiujacy z argumentem "temp" i tworzy jego kopie na stercie i zwraca referencje do nowego obiektu. ----- T.2.10 Czy istnieje domyslny konstruktor kopiujacy? Tak - kopiuje poszczegolne pola. Z tego powodu nie nadaje sie do klas zawierajacych wskazniki - w efekcie otrzymujemy dwa obiekty wskazujace na ten sam (trzeci) obiekt. Jezeli teraz jeden z tych obiektow zostanie usuniety, to najprawdopodobniej zostanie tez zniszczony obiekt przez niego wskazywany, i drugi z obiektow bedzie wskazywal cos blednego. Dlatego tez gdy uzywamy operacji przypisania, a dana klasa zawiera wskazniki, to trzeba konstruktor kopiujacy zdefiniowac samemu, umieszczajac w nim operacje potrzebne do utworzenia kopii obiektu wskazywanego przez wskaznik. ----- T.2.11 Jak uniknac dolaczania metod wirtualnych, z ktorych nie korzystam, a sa zadeklaroawne w definicji objektu? Pozne laczenie ("late binding"), ktore UMOZLIWIA tworzenie metod wirtualnych, polega wlasnie na tym, ze program w momencie kompilacji i linkowania _nie wie_, ktore metody beda mu potrzebne. Inna sprawa ze zwyklymi metodami. ------- T.2.12 Ciekawostki z historii C++. Autorem C++ jest Bjarne Stroustrup. W swojej ksiazce "The Design and Evolution of C++" skladajac wyrazy holdu za wplyw na powstanie jezyka C++, Stroustrup wymienia m.in. nastepujace osoby: Briana Kernighana, Andrew Koeniga, Douga McIlroya, Jonathana Shopiro. Kristen Nygaard (Simula 67) i Dennis Ritchie (C) zajmuja na tej liscie miejsca szczegolnie eksponowane. W pazdzierniku 1979 roku istnial 1 uzytkownik C++ (C z klasami), w pazdzierniku 1981 C++ mial 38 uzytkownikow, w dziesiec lat pozniej - 400 000 osob przyznawalo sie do programowania w C++. A obecnie? Obecnie trwaja prace nad normalizacja jezyka C++, prowadzone przez kilka cial standaryzacyjnych. Standard jest juz zatwierdzony, i mozna go zakupic bezposrednio w ANSI. Bjarne Stroustrup od cwiercwiecza interesuje sie filozofia i historia. Jego sympatie do empirystow i awersja do idealistow, "uszczesliwiajacych" ludzkosc "tym, co dla niej dobre" (slowa Stroustrupa), wplynely na niektore decyzje i rozwiazania projektowe w C++. ------- T.2.13 Stosowac wskaznik czy referencje? Istnieja zasadnicze roznice miedzy wskaznikiem, a referencja: 1. Referencje nie moga byc puste 2. Raz ustawionej referencji nie mozna przeniesc na inny obiek 3. Nie mozna zrobic referencji do referencji, tak jak robi sie wskaznik do wskaznika. Generalnie, lepiej jest stosowac referencje. Jednakze jezeli z wyzej wymienionych powodow jest to niemozliwe, to nalezy zastosowac wskaznik. ------- T.2.14 Co to sa sprytne wskazniki (smart pointers)? Jest to szczegolny rodzaj klas, ktore definiuja operator rzutowania na typ pierwotny (ktory opakowuja). Z tego powodu moga byc stosowane w programie tak, jakby byly typu pierwotnego. Najbardziej znane przyklady sprytnych wskaznikow to string (opakowujacy wskaznik do char) i auto_ptr (szablon parametryzowany opakowywanym typem) ze standradowej biblioteki C++. ------- T.2.15 Czy wszystkie metody w mojej klasie powinny byc wirtualne? W zasadzie tak. Deklarujac metode jako niewirtualna uniemozliwiasz zmiane jej implementacji w klasie dziedziczacej, a tym samym zawezasz elastycznosc swojego systemu. Jednakze w przypadku metod prostych, np. jedynie zwracajacych referencje do atrybutu, lepiej zrobic je inline, a metoda inline nie moze byc wirtualna. ------- T.2.16 Czy konstruktory moga byc wirtualne? Nie. Ale mozna stworzyc odpowiednik konstruktora wirtualnego. Opisuje to wzorzec Abstract Factory z ksiazki "Design Patterns", Gamma et al. ------- T.2.17 Jak tworzyc klasy abstrakcyjne? Klasa abstrakcyjna jest kazda klasa, ktora ma choc jedna metode czysto wirtualna (abstrakcyjna), czyli zadeklarowana, a nie zaimplementowana. Mozna klase uczynic abstrakcyjna takze deklarujac wszystkie jej konstruktory jako prywatne lub chronione (protected). --------------------------------------------------------------------------- ----- T.3.1 Czy jest dostepna darmowa implementacja Smalltalka? Tak - w ramach GNU. Znalezc go mozna w wiekszosci katalogow z GNU. ----- T.3.2 Czy SmallTalk jest dobry w praktyce, czy tylko w teorii? W przypadku Smalltalka o teorii mogla byc mowa jakies 10 lat temu. Teraz jest to praktyka. Niejaki Dave Thomas z Kanady odpowiedzial na to pytanie w bardzo ciekawym referacie. Oto, co wdrozono na Smalltalku: 1. Centrale telefoniczna dla kilkudziesieciotysiecznego miasta. 2. "Zastosowania specjalne". 3. IBM zatrudnil ostatnio (pocz.'94) okolo 300 programistow w Smalltalku. Chyba nie do podlewania kwiatkow. 4. System analizy jakosci programow napisanych w C. Tyle pamietam. Inna sprawa, ze Smalltalk nie dorownuje C++ rozpowszechnieniu, wiec i produkty komercyjne nie sa tak czeste. Ja nie potrafie podac zadnych, ale w C++ to chyba tez tylko te, w ktorych pisaniu sam uczestniczylem. Czytalem, ze zrobienie jednej klasy w Smalltalku zajmuje 1 osobodni, w C++ trzy razy tyle. Oczywiscie slyszalem to od entuzjastki Smalltalka, wiec trzeba wziac poprawke. ----- T.3.3 Gdzie mozna dowiedziec sie o jezyku Smalltalk i jego zastosowaniach? Pod nastepujacym adresem: http://www.stic.org Jest to adres Smalltalk Industry Council, instytucji zrzeszajacej firmy produkujace oprogramowanie i narzedzia do Smalltalka. Pod tym adresem znalezc mozna liste dostepnych kompilatorow (komercyjnych i darmowych), firmy produkujace biblioteki i narzedzia, materialy do nauki Smalltalka, informacje o wybranych projektach wykonanych przy pomocy Smalltalka oraz porownanie sprawnosci Smalltalka z jezykami C i C++. --------------------------------------------------------------------------- ----- T.4.1 Jak powinienem zabrac sie za programowanie obiektowe? Wykonac analize i projekt. Wybrac jezyk i zaimplementowac projekt. Na poczatek doradzam kilka niewielkich projektow. Nie zaszkodzi poczytac o analizie, projektowaniu i programowaniu obiektowym. ----- T.4.2 Czy OOP oznacza brak optymalizacji? Ani tak, ani nie - zaden jezyk z gory nie zaklada braku optymalizacji. To zalezy tylko i wylacznie od konkretnego programu. ----- T.4.3 Jak rozpoznawac, czy dany program lub projekt jest dobry ? Mozliwe kryteria: o dziala - dobrze, nie dziala - zle o stopien realizacji obiektow jako "czarnych skrzynek" o zbyt mala lub zbyt duza wiedza klas o czytelnosc o podatnosc na zmiany o powiazania miedzy modulami o mozliwosc powtornego uzycia ----- T.4.4 Poszukuje informacji na temat rozszerzen do jezykow obiektowych (C++, Smalltalk, Eiffel), takich jak np. O++ do C++ O++ jest rozszerzeniem C++ pozwalajacym na tworzenie obiektow trwalych (persistent), manipulowanie nimi, laczenie w clustery etc. Jesli chodzi o Smalltalk, to jego rozszerzeniem jesli silnie stypizowany Strongtalk. --------------------------------------------------------------------------- end of pl.comp.object FAQ and Summary ---------------------------------------------------------------------------
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads