nntp2http.com
Posting
Suche
Optionen
Hilfe & Kontakt

pl.comp.objects FAQ (Frequently Asked Questions and more)

Von: Kamil Konieczny (kkoniec@mks.com.pl) [Profil]
Datum: 15.09.2009 18:10
Message-ID: <pl-comp-objects-faq-1-1253031008@ict.pwr.wroc.pl>
Followup-to: pl.comp.objects
Newsgroup: pl.answers pl.comp.objects
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
---------------------------------------------------------------------------


[ Auf dieses Posting antworten ]