Article View: pl.comp.lang.c
Article #310497Re: LISKOV and SOLID
From: Przemek Biernat
Date: Mon, 22 Jan 2024 15:53
Date: Mon, 22 Jan 2024 15:53
60 lines
5258 bytes
5258 bytes
> > 1. Pojedyncza odpowiedzialność. Według mnie klasy wymyślono po to aby grupować i zamykać funkcjonalność. Czy chodzi o to aby klasy miały po jednej metodzie? > Klasa o jednej metodzie jest praktycznie bezużyteczna. > > Wiec na pewno nikt nie wpadłby na tak głupi pomysł. Właśnie ostatnio czytałem tutorial o SOLID i tam ktoś wpadł na taki pomysł. Stąd moje pytanie. > > Są rózne koncpecje co to jest klasa, od podobnych do Java bean po good > object. Wszystkei znajdziesz w żywym kodzie i znajdziesz też wielu > zwolenników pisania na oba sposoby. Obserwacja: i tak będziesz pisał > tak, jak kod zastany. Zwykle robię interfejs/klasę bazową poniżej template i później klasy potomne te moje ulubione pyłki. Do tego fabrykę. To jest moja podstawa. Później jakieś klasy wykonujące algorytmy czy jak tam, w zależności od potrzeby. > > 2. Otwarte zamknięte. Przykład: wzorzec fabryka, jak ci dochodzi kolejna klasa to i tak musisz zmienić kod fabryki i dodać generowanie klasy. > Nikoniecznie, może istnieć inna fabryka produkująca inne typy, o typie > bazowym takim samym jak ta pierwsza. Innymi słowy *niektóre* fabryki nic > nie muszą wiedzieć o nowych implementacjach zwarcanej przez nie abstrakcji. Tak jak wyżej typowany polimorfizm statyczny, typowany bo dla każdego pyłku mam wartość enum przekazywaną w konstruktorze. W fabryce tablica wskaźników na funkcję create<>. > Ba, zaryzykuję stwierdzenie, że w prawidłowo skonstruowanej abstrakcji, > taki rodzaj multi-fabryk jest często spotykanym wzorcem. Implementacja > produkuje klasy o okreslonym interfejsie z puli tych, które zna jako > swoją implementację. Nie musi nic wiedzieć o innej implementacji tego > samego interfejsu. No wiem można zrobić abstrakcyjną fabrykę i generować z puli dla fabryki konkretnej to mi trochę przypomina most > > 3. Liskov. To już jest czysty idealizm. Często nie udaje się aby wszystkie klasy potomne implementowały funkcje wszystkie funkcje klasy bazowej. Wyjściem są wiszące metody lub rzutowanie, osobiście preferuje static_cast z kontrolą typu. > Jesli potomne klasy mają "wiszące" metody to coś spieprzyłeś. Bardzo > łatwo jest to spieprzyć czytając wszelkie poradniki z okolic "class Ryba > : publi Zwierze". To zazwyczaj stek bzdur pisany przez ignorantów. Pełno > tego w ksiażkach, autorzy najwyraźniej nigdy nie wyszli poza ten poziom > komplikacji. Podobnie jak wyżej statyczny polimorfizm > > Zainteresuj się rozwiązaniem tego problem, na przykład za pomocą > doprecyzowania interfejsu wizytacją, czy jakąkolwiek inną metodą tego typu. wizytacji nie czaje i chyba nigdy nie zrozumiem - słabo opisana lub nie zrozumiale dla mnie w pozycji bandy czterech > > A co powiecie gdyby iteratory były przekażywane przez wskaźnik i taki iterator był zwracany na zewnątrz klasy w celu wykonania algorytmu poza klasą ale na kontenerze klasy. > Powiedziałbym, że to normalna praktyka od początku istnienia koncepcji > iteratorów. Przykładowo, całkiem naturalne jest zwracanie iteratora > java-like własnie przez [smart]pointer. Nie ma w tym nic dziwnego. Robię > tak od dziesięcioleci. > > Iteratory STL maja inną koncepcję działania, są kopiowalne. > To dobrze wiedzieć że nie jestem sam pod względem zwracania iteratorów. Tak w STL jest to trochę słabe ale pewnie da się. > Używasz obu konstrukcji, głównie dlatego, że Java-like łatwiej jest > zrobić abstrakcyjny, a stl lepiej się optymalizuje. Programowałem we własnej bibliotece standardowej i tam był poprostu wskaźnik na iterator, który to trzeba było na zewnątrz usunąć
Technical Details
Message-ID:
<3456ffce-53b8-40e8-9bd1-55018dc92094n@googlegroups.com>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!1.us.feeder.erje.net!feeder.erje.net!usenet.blueworldhosting.com!diablo1.usenet.blueworldhosting.com!peer03.iad!feed-me.highwinds-media.com!news.highwinds-media.com!news-out.google.com!nntp.google.com!postnews.google.com!google-groups.googlegroups.com!not-for-mailReferences:
<a08f4202-1445-49c5-93f2-67917f369cddn@googlegroups.com> <uoh8lq$3q7vg$1@dont-email.me> <65b2e948-fef2-45ba-89b1-d6aac3b16de9n@googlegroups.com> <uojm0u$9196$2@dont-email.me>Show Full Headers
Complete Article Headers
X-Received: by 2002:a05:6214:318c:b0:686:89ca:b5bd with SMTP id lb12-20020a056214318c00b0068689cab5bdmr28365qvb.1.1705938834697; Mon, 22 Jan 2024 07:53:54 -0800 (PST) X-Received: by 2002:a05:6820:1610:b0:598:e20b:1866 with SMTP id bb16-20020a056820161000b00598e20b1866mr326662oob.0.1705938834464; Mon, 22 Jan 2024 07:53:54 -0800 (PST) Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!1.us.feeder.erje.net!feeder.erje.net!usenet.blueworldhosting.com!diablo1.usenet.blueworldhosting.com!peer03.iad!feed-me.highwinds-media.com!news.highwinds-media.com!news-out.google.com!nntp.google.com!postnews.google.com!google-groups.googlegroups.com!not-for-mail Newsgroups: pl.comp.lang.c Date: Mon, 22 Jan 2024 07:53:54 -0800 (PST) In-Reply-To: <uojm0u$9196$2@dont-email.me> Injection-Info: google-groups.googlegroups.com; posting-host=193.238.201.2; posting-account=JqeG5AoAAAAiFyQBrqF1gF5A1eLVPTrJ NNTP-Posting-Host: 193.238.201.2 References: <a08f4202-1445-49c5-93f2-67917f369cddn@googlegroups.com> <uoh8lq$3q7vg$1@dont-email.me> <65b2e948-fef2-45ba-89b1-d6aac3b16de9n@googlegroups.com> <uojm0u$9196$2@dont-email.me> User-Agent: G2/1.0 MIME-Version: 1.0 Message-ID: <3456ffce-53b8-40e8-9bd1-55018dc92094n@googlegroups.com> Subject: Re: LISKOV and SOLID From: Przemek Biernat <biernat.przemyslaw@gmail.com> Injection-Date: Mon, 22 Jan 2024 15:53:54 +0000 X-Received-Bytes: 5808 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit