🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.c
Article #310497

Re: LISKOV and SOLID

#310497
From: Przemek Biernat
Date: Mon, 22 Jan 2024 15:53
60 lines
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-mail
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>

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