Maciej W.

Maciej W. Ruby on what?!

Temat: Walidacja formularzy po której stronie?

Tomasz Zadora:
Pomyłka, założenie jest takie, że model może posiadać metody ale tylko takie które nie zmieniają jego stanu.
(...)
Naprawdę proszę już nie pisać polemik bo to nie ma sensu.

Ok ok. Moze to tylko jedno wielkie semantyczne nieporozumienie, chcialbym zobaczyc jak to wyglada w praktyce.
Zalozmy wiec ze mamy model samochodu, jednym z atrybutow jest przebieg. Samochod przejachal ilestam kilometrow. Wrzuc kod jak zmieniasz przebieg.Maciej W. edytował(a) ten post dnia 08.02.11 o godzinie 17:44
Tomasz Zadora

Tomasz Zadora programuję

Temat: Walidacja formularzy po której stronie?

Pasywny model to coś martwego - chociaż nie do końca bo może zawierać metody które nie zmieniają jego stanu, kontroler to działanie.

Kontroler z kolei może zawierać właściwości i mieć stan ale powinien ten stan być traktowany jako ulotny.

Przy takim założeniu tak naprawdę mamy dwa obiekty opisujące jeden obiekt: model i kontroler.

Najpierw tworzymy model samochodu który posiada licznik, którego już nie będzemy rozbijać na osobny model/kontroler (w ten sposób moglibyśmy dojść do atomów). Następnie kontroler który może zawierać w sobie model.

$Samochod = new ModelSamochodu();
$Kontroler = new KontrolerSamochodu($Samochod);
$Kontroler->zwiekszLicznik($oIleKm);

Kontroler niekoniecznie musi zawierać model, można sobie wyobrazić kontrolera działającego na wielu pasywnych modelach.

$Samochod = new ModelSamochodu();
$Kontroler = new KontrolerSamochodu();
$Kontroler->zwiekszLicznik($Samochod, $oIleKm);

Bardziej zrozumiale jak sądzę byłoby jeżeli stworzylibyśmy Obiekt Samochód który zawiera w sobie model samochodu oraz kontroler :) Jednak wtedy to już nie było by MVC w takim wzorcu o jakim pisze, chyba że ten obiekt traktujemy jak kontroler wtedy ok.Tomasz Zadora edytował(a) ten post dnia 08.02.11 o godzinie 18:04
Jarosław Żeliński

Jarosław Żeliński Analityk i
Projektant Systemów

Temat: Walidacja formularzy po której stronie?

Tomasz Zadora:
Jarek Żeliński:
[...]
jeżeli jakąkolwiek logikę dziedziny (w tym walidację) umieścimy w widoku to każda sytuacja posiadania inteligentnych skórek (osobno na komputer, osobno na telefon, osobno, na smartfony itp.) doprowadzi do powielania reguł biznesowych (walidacji) i stracimy podstawową korzyść: jednoosobowa (punktowa) odpowiedzialność.

Nie nie pisałem o umieszczaniu logiki w viewerze, rozumiem więc, że to Twoja taka poboczna dygresja ?

a czym jak nie elementem logiki jest walidacja?

wtedy nazywa się Anemiczny Model Dziedziny i jest dokładnie antywzorcem:

Pomyłka, założenie jest takie, że model może posiadać metody ale tylko takie które nie zmieniają jego stanu.

mam obiekt Kowalski:Osoba, gdzie umieścisz metodę "Załóż czapkę" albo "Zwiększ swój wiek o jeden"?

http://pl.wikipedia.org/wiki/Model-View-Controller#Pas...

" Żądanie zmiany stanu i wykonania jakichś operacji pochodzi zawsze z kontrolera oraz z widoku za pośrednictwem udostępnionego API"

akurat ta definicja MVC w wiki bazuje właśnie na EJB... niech sobie tam taka będzie, to tylko WIKI czyli "wiedza społeczna".
Logika biznesowa to Model

Kto tak napisał i dlaczego miało by to być wiążące ? Ok powiedzmy, że to prawda, w takim razie kontroler nie jest logiką ? :D

ależ to nie jest wiążące :), źle pojmujesz moje wypowiedzi, ja i nie tylko, pisze o tym jak projektuje, dlaczego, oraz że MVC u uznanych praktyków (między innymi Fowler a także Evans ten od DDD) także jest tak postrzegany.

Kontroler nie jest logiką biznesową a logiką sterowania. To tak w samochodzie kierowca to logika i sterowanie tym do czego samochód jest używany czyli Model, komputer pokładowy to Kontroler, który działa zawsze tak samo niezależnie od tego do czego użyjemy samochodu i jak oraz gdzie pojedzie kierowca anawet jak zmieni się kierowca (samochód bez kierowcy to framework MVC z miejscem na Model).

Jedna uwaga, np. ja albo Wojtek piszemy jak projektujemy i dlaczego. Ja to już napisano, dlaczego? Bo oprogramowanie tak zaprojektowane jest bardzo łatwe i tanie w rozwoju i modyfikacji, absolutnie nie piszemy, że to "jednie słuszna metoda".

Gdyby kontrola danych była w Widoku to dodanie w przyszłości nowych interfejsów wiązało by się z powielaniem reguł walidacji w każdym kolejnym widoku a także interfejsie (np. poza wprowadzaniem danych przez człowieka pobierał bym je także z innego systemu, nazwijmy to "chmurą;, żeby było modnie. Jak się to rozrośnie, to reguła opisująca np. numer telefonu będzie powielona tle razy ile mam widoków i interfejsów. Poza pracochłonnością nie widzę w tym nic złego :)Jarek Żeliński edytował(a) ten post dnia 08.02.11 o godzinie 18:13
Maciej W.

Maciej W. Ruby on what?!

Temat: Walidacja formularzy po której stronie?

Tomasz Zadora:
$Samochod = new ModelSamochodu();
$Kontroler = new KontrolerSamochodu($Samochod);
$Kontroler->zwiekszLicznik($oIleKm);

Chodzilo mi o troche wiecej szczegolow, na przyklad wnetrze metody zwiekszLicznik
Tomasz Zadora

Tomasz Zadora programuję

Temat: Walidacja formularzy po której stronie?

Jarek Żeliński:
a czym jak nie elementem logiki jest walidacja?

Proszę mi wskazać, gdzie napisałem, że walidacja ma być w widoku. Pisałem, że ja ją umieszczam w kontrolerze.


wtedy nazywa się Anemiczny Model Dziedziny i jest dokładnie antywzorcem:

Pomyłka, założenie jest takie, że model może posiadać metody ale tylko takie które nie zmieniają jego stanu.

mam obiekt Kowalski:Osoba, gdzie umieścisz metodę "Załóż czapkę" albo "Zwiększ swój wiek o jeden"?

Taki obiekt nie jest zgodny z MVC bo Kowalski to jednocześnie model i kontroler, i tu właśnie tkwi Twój problem.

W MVC Kowalski składa się z Ciała - czyli Modelu i powiedzmy "duszy" czyli kontrolera. To Dusza/siła woli tak naprawdę zakłada czapkę. Co do zwiększania wieku to już w ogóle jest bardzo złozony proces i sam kowalski tego nie robi.

[...]
Kontroler nie jest logiką biznesową a logiką sterowania.

Biznes to jest proces. Gdziekolwiek w wyniku logiki zachodzi działanie musi być w jakiś sposób przeprowadzone. Wrcamy do tego samego - ktoś chce mieć aktywny model i tam umieszczać logikę, ok, jego sprawa, ja wolę mieć modele pasywne.

Gdyby kontrola danych była w Widoku to dodanie w przyszłości nowych interfejsów wiązało by się z powielaniem reguł

Nie wiem dlaczego tak bardzo uczepiłeś się kontroli w widoku absolutnie nigdzie o tym nie pisałem.
Tomasz Zadora

Tomasz Zadora programuję

Temat: Walidacja formularzy po której stronie?

Maciej W.:
Tomasz Zadora:
$Samochod = new ModelSamochodu();
$Kontroler = new KontrolerSamochodu($Samochod);
$Kontroler->zwiekszLicznik($oIleKm);

Chodzilo mi o troche wiecej szczegolow, na przyklad wnetrze metody zwiekszLicznik

To chyba logiczne:


function zwiekszLicznik($oIleKm)
{
// Metoda pasywna, nie zmienia stanu, informacja od modelu
// ktory przeanalizuje swoj stan, nie zmieniajac go i da odpowiedz
$wynik = $this->Samochod->czyLicznikMoznaZwiekszyc();

// Akcja - zmiana stanu modelu
if ($wynik) $this->Samochod->licznik += $oIleKm;
}
Tomasz Zadora edytował(a) ten post dnia 08.02.11 o godzinie 18:23
Jarosław Żeliński

Jarosław Żeliński Analityk i
Projektant Systemów

Temat: Walidacja formularzy po której stronie?

Tomasz Zadora:
Jarek Żeliński:
a czym jak nie elementem logiki jest walidacja?

Proszę mi wskazać, gdzie napisałem, że walidacja ma być w widoku. Pisałem, że ja ją umieszczam w kontrolerze.

ok, chyba kto inny, ale to nie zmienia faktu, że umieszczasz w kontrolerze (czyli w tym co powinno być wspólne dla różnych aplikacji) specyfikę konkretnego problemu oraz to, ze specyfikę obiektu podzieliłeś na dwa różne miejsca łamiąc zasadę skupienia odpowiedzialności.

mam obiekt Kowalski:Osoba, gdzie umieścisz metodę "Załóż czapkę" albo "Zwiększ swój wiek o jeden"?

Taki obiekt nie jest zgodny z MVC bo Kowalski to jednocześnie model i kontroler, i tu właśnie tkwi Twój problem.


nie, Kowalski to np. element dziedziny systemu zarządzania aktorami na scenie, co to znaczy "obiekt niezgodny z MVC"??? Czy aby na pewno ja czegoś nie rozumiem?

W MVC Kowalski składa się z Ciała - czyli Modelu i powiedzmy "duszy" czyli kontrolera. To Dusza/siła woli tak naprawdę zakłada czapkę. Co do zwiększania wieku to już w ogóle jest bardzo złozony proces i sam kowalski tego nie robi.

no to po protu różnimy się :) i projektujemy inaczej, nie ma w tym nic złego, bo dla mnie Kowalski to "koleś z mózgiem" i on jest Modelem (wraz z mózgiem który pamięta ile ma lat i potrafi się zachować) w MVC. Kowalski wie ile ma lat, wie kiedy ma czapkę i potrafi tę czapkę zakładać i zdejmować. I nie chodzi już o MVC a w ogóle o projektowanie poprzez kontrakty. Może problem w tym, ze nie nie jestem chrześcijaninem i ta dusza do mnie nie przemawia jakoś...
Kontroler nie jest logiką biznesową a logiką sterowania.

Biznes to jest proces. Gdziekolwiek w wyniku logiki zachodzi działanie musi być w jakiś sposób przeprowadzone. Wrcamy do tego samego - ktoś chce mieć aktywny model i tam umieszczać logikę, ok, jego sprawa, ja wolę mieć modele pasywne.

i tu widzę punkt styku: każdy projektuje jak lubi :)
Gdyby kontrola danych była w Widoku to dodanie w przyszłości nowych interfejsów wiązało by się z powielaniem reguł

Nie wiem dlaczego tak bardzo uczepiłeś się kontroli w widoku absolutnie nigdzie o tym nie pisałem.

Ty nie, ale w dyskusji biorą udział także inni, to faktycznie nie było do Ciebie. Tu dodam tylko to co chyba gdzie indziej napisałem: Mając framework MVC kolejne aplikacje dla kolejnych klientów to tylko nowe komponenty Model i niezmienione poza kosmetyką Vidok i Controller. Wtedy możliwe jest hurtowe uaktualnianie szkieletu u różnych klientów nie niszcząc systemu po podmieniasz tylko dwa z trzech komponentów MVC (tylko V i C), tak np. działa WordPress i inne. Jak wgram porządnie napisany komponent "Sklep" do Wordpresa to WSZSYTKO jest w Modelu, cała logika obsługi sprzedaży.
Tomasz Zadora

Tomasz Zadora programuję

Temat: Walidacja formularzy po której stronie?

Koncepcja duszy nie jest koncepcją tylko i wyłącznie chrześcijańską, to zresztą tylko etykieta do czegoś co np. w buddyzmie nazywa się strumieniem świadomości a w innych religiach jeszcze inaczej.

Kowalski może sobie liczyć ile ma lat ale on ich nie zwiększa tak samo jak nie ma mocy aby je zwiększyć, nie mówiąc już o tym, że koncepcja wieku jest totalnie płaska i liniowa, ale nie wchodźmy w filozofię.

Co do wordpressa - jest tak a nie inaczej zbudowany.

Natomiast system działający na zasadzie modeli pasywnych jest równie dobry i tak samo można stworzyć autonomiczne wtyczki, jak "sklep", działające w takim wzorcu - wystarczy odrobina wyobraźni.

Po za tym mam wrażenie, że próbujesz udowodnić, że Twój styl jest lepszy, ja nie, dlatego dalsza dyskusja imo nie ma sensu.Tomasz Zadora edytował(a) ten post dnia 08.02.11 o godzinie 19:05
Maciej Marczuk

Maciej Marczuk Software Engineer

Temat: Walidacja formularzy po której stronie?

Tomasz Zadora:
Koncepcja duszy nie jest koncepcją tylko i wyłącznie chrześcijańską, to zresztą tylko etykieta do czegoś co np. w buddyzmie nazywa się strumieniem świadomości a w innych religiach jeszcze inaczej.

to dopiero OT ;)

Co do wordpressa - jest tak a nie inaczej zbudowany.

Natomiast system działający na zasadzie modeli pasywnych jest równie dobry i tak samo można stworzyć autonomiczne wtyczki, jak "sklep", działające w takim wzorcu - wystarczy odrobina wyobraźni.

Po za tym mam wrażenie, że próbujesz udowodnić, że Twój styl jest lepszy, ja nie, dlatego dalsza dyskusja imo nie ma sensu.

bo jezeli rozmawiamy o analizie/projektowaniu obiektowym to nie tyle jest lepszy co poprawny.
W duzym uproszczeniu to co Ty proponujesz to zejscie do poziomu traktowania klas jako pojemnikow do przechowywania funkcji, takiego nowego ladnego opakowania na funkcje... Nie mowimy ze to jest zle (obiektowka nie zawsze sie sprawdza) tylko ze jest w glebi serca podejsciem proceduralnym a nie obiektowym

pozdrawiam i zycze milego wieczoru :)
Maciej W.

Maciej W. Ruby on what?!

Temat: Walidacja formularzy po której stronie?

Tomasz Zadora:
To chyba logiczne:


function zwiekszLicznik($oIleKm)
{
// Metoda pasywna, nie zmienia stanu, informacja od modelu
// ktory przeanalizuje swoj stan, nie zmieniajac go i da odpowiedz
$wynik = $this->Samochod->czyLicznikMoznaZwiekszyc();

// Akcja - zmiana stanu modelu
if ($wynik) $this->Samochod->licznik += $oIleKm;
}

A co ze zmiennymi private/protected? Nie uzywasz ich wogole? Bo skoro wg Ciebie klasa nie powinna miec metod ktore ja modyfikuja, to
nigdy nic do nich przypiszesz.

Naprawde tworzac model samochodu utworzylbys przebieg jako zmienna publiczna? W ten sposob nic nie powstrzymuje nikogo przed
$samochod->licznik = $wartosc_z_kosmosu


Tomasz Zadora:
Pomyłka, założenie jest takie, że model może posiadać metody ale tylko takie które nie zmieniają jego stanu.

http://pl.wikipedia.org/wiki/Model-View-Controller#Pas...

" Żądanie zmiany stanu i wykonania jakichś operacji pochodzi zawsze z kontrolera oraz z widoku za pośrednictwem udostępnionego API"

Czy jestes pewien ze dobrze interpretujesz to co jest tam napisane? To ze model pasywny reprezentuje elementy, które nigdy samoczynnie nie zmieniają swojego stanu to IMO nie znaczy ze model nie moze posiadac metody ktora zmieni jego stan. Znaczy to ze elementy takiego modelu nie zmieniaja swojego stanu same z siebie (przyklad co to znaczy ze stan zmienia sie sam masz w opisie modelu aktywnego, gdzie kopiowanie trwa i stan 'postepu' zmienia sie jakoby samoczynnie).
Tomasz Zadora:
Metody używane w obiektach to procedury, tyle że "otoczone" (enkapsulacja) obiektem i dlatego są metodami a nie procedurami.

Enkapsulacja to
http://en.wikipedia.org/wiki/Encapsulation_%28computer...
Po naszemu na wszelki wypadek http://pl.wikipedia.org/wiki/Hermetyzacja

Generalnie to jesli Twoje podejscie "dziala dla Ciebie" to rob sobie tak, nic mi do tego. Programowanie ma to do siebie ze do celu mozna dotrzec roznymi drogami.
Jednak wypisywanie ze to zle jesli obiekt posiada metode ktore zmienia jego stan moze mocno namieszac w glowie osobie ktora stawia pierwsze kroki w OOP.Maciej W. edytował(a) ten post dnia 08.02.11 o godzinie 19:27
Tomasz Zadora

Tomasz Zadora programuję

Temat: Walidacja formularzy po której stronie?

Maciej W.:

Naprawde tworzac model samochodu utworzylbys przebieg jako zmienna publiczna? W ten sposob nic nie powstrzymuje nikogo przed
$samochod->licznik = $wartosc_z_kosmosu


Nie w aplikacjach PHP działających na serwerze WWW, kwestie bezpieczeństwa można inaczej rozwiązać niż przez private/protected.

Tomasz Zadora:
Metody używane w obiektach to procedury, tyle że "otoczone" (enkapsulacja) obiektem i dlatego są metodami a nie procedurami.

Enkapsulacja to
http://en.wikipedia.org/wiki/Encapsulation_%28computer...
Po naszemu na wszelki wypadek http://pl.wikipedia.org/wiki/Hermetyzacja

Trochę ironii nie zaszkodzi, prawda ? Tyle, że to co napisałem mieści się w tym co jest na wikipedii.

Jednak wypisywanie ze to zle jesli obiekt posiada metode ktore zmienia jego stan moze mocno namieszac w glowie osobie ktora

Nie napisałem tak, kolejne kłamstwo. Napisałem, że *model* nie powinien tego robić.
Jarosław Żeliński

Jarosław Żeliński Analityk i
Projektant Systemów

Temat: Walidacja formularzy po której stronie?

Tomasz Zadora:
Kowalski może sobie liczyć ile ma lat ale on ich nie zwiększa tak samo jak nie ma mocy aby je zwiększyć, nie mówiąc już o tym, że koncepcja wieku jest totalnie płaska i liniowa, ale nie wchodźmy w filozofię.

otóż: Kowalski dla zwykłej wygody poza datą urodzenia ma w pamięci także to ile ma lat by szybciej na takie pytania odpowiadać, każdego sylwestra zapamiętuje, ze się własnie postarzał o rok.
Co do wordpressa - jest tak a nie inaczej zbudowany.

ciekawe dlaczego :)
Natomiast system działający na zasadzie modeli pasywnych jest równie dobry i tak samo można stworzyć autonomiczne wtyczki, jak "sklep", działające w takim wzorcu - wystarczy odrobina wyobraźni.

powtarzam, nie twierdze, że źle projektujesz, a tylko, że można inaczej ;)

Po za tym mam wrażenie, że próbujesz udowodnić, że Twój styl jest lepszy, ja nie, dlatego dalsza dyskusja imo nie ma sensu.

nigdzie nie napisałem, ze lepszy a inny, on się nazywa Obiektowy :), skup się :)
Jarosław Żeliński

Jarosław Żeliński Analityk i
Projektant Systemów

Temat: Walidacja formularzy po której stronie?

Tomasz Zadora:
Nie w aplikacjach PHP działających na serwerze WWW, kwestie bezpieczeństwa można inaczej rozwiązać niż przez private/protected.

cechą metod OOP jest niezależność projektu od implementacji wiec samo wplatanie tu warunkowania "bo w PHP" już czyni taki projekt "nie OOP".
Wojciech Soczyński

Wojciech Soczyński Programista
eksplorator -
blog.wsoczynski.pl

Temat: Walidacja formularzy po której stronie?

Tomasz Zadora:
Nie w aplikacjach PHP działających na serwerze WWW, kwestie bezpieczeństwa można inaczej rozwiązać niż przez private/protected.

Private i protected nie służy do zapewniania bezpieczeństwa. Gdyby tak było to nie dało by się zrobić tak (array)$jakisObiekt i odczytać zmiennych private i protected ;)
Tomasz Zadora

Tomasz Zadora programuję

Temat: Walidacja formularzy po której stronie?

Na poprzednie rzeczy i podobne już nie odpowiadam bo to gonienie w kółko.

Natomiast regulowanie bezpieczeństwa, lub rozwiązywanie innych kwestii
inaczej niż przez private/protected jest czymś abstrakcyjnym.

Tekst o PHP dodałem dlatego, że zabawa w private/protected akurat w tym środowisku jest najczęściej jedynie dodatkowym obciążeniem zmniejszającym wydajność.

http://www.linuxdocs.org/HOWTOs/PHP-HOWTO-7.htmlTomasz Zadora edytował(a) ten post dnia 08.02.11 o godzinie 20:10
Wojciech Soczyński

Wojciech Soczyński Programista
eksplorator -
blog.wsoczynski.pl

Temat: Walidacja formularzy po której stronie?

Tomasz Zadora:
Na poprzednie rzeczy i podobne już nie odpowiadam bo to gonienie w kółko.

Natomiast regulowanie bezpieczeństwa, lub rozwiązywanie innych kwestii
inaczej niż przez private/protected jest czymś abstrakcyjnym.

Tekst o PHP dodałem dlatego, że zabawa w private/protected akurat w tym środowisku jest najczęściej jedynie dodatkowym obciążeniem zmniejszającym wydajność.

http://www.linuxdocs.org/HOWTOs/PHP-HOWTO-7.htmlTomasz Zadora edytował(a) ten post dnia 08.02.11 o godzinie 20:10
Masz może jakieś benchmarki, które to potwierdzą (spadek wydajności)? Programowanie obiektowe nie powstało dla większej wydajności a dla większej czytelności :)
Tomasz Zadora

Tomasz Zadora programuję

Temat: Walidacja formularzy po której stronie?

Wojciech Soczyński:
(array)$jakisObiekt i odczytać zmiennych private i protected ;)


Bo to jest cecha PHP, spróbuj tak zrobić np. w Javie. Głównie jednak chodzi o ukrywanie i poziomy dostępu, czyli bezpieczeństwo.
Wojciech Soczyński

Wojciech Soczyński Programista
eksplorator -
blog.wsoczynski.pl

Temat: Walidacja formularzy po której stronie?

Tomasz Zadora:
Wojciech Soczyński:
(array)$jakisObiekt i odczytać zmiennych private i protected ;)


Bo to jest cecha PHP, spróbuj tak zrobić np. w Javie. Głównie jednak chodzi o ukrywanie i poziomy dostępu, czyli bezpieczeństwo.
W Javie można przy pomocy refleksji zrobić ObiektKlasy->setAccessible('nazwaWlasnosci'); i dostać się do prywatnych i chronionych własności. Szczegóły tu:
http://radio.javaranch.com/val/2004/05/18/108489179300...
Btw. twój Linuksowy link jest z 2001 -> v25.4, 13 July 2001 , trochę się zdezaktualizował ;)Wojciech Soczyński edytował(a) ten post dnia 08.02.11 o godzinie 20:27
Tomasz Zadora

Tomasz Zadora programuję

Temat: Walidacja formularzy po której stronie?

Masz może jakieś benchmarki, które to potwierdzą (spadek wydajności)? Programowanie obiektowe nie powstało dla większej wydajności a dla większej czytelności :)

Nie nie mam benchmarków i nie chce mi się robić. Tu zresztą głównie chodzi o to, że stosując priv/prot. jest tendencja do zwiększania ilości kodu, a to w PHP dość wrażliwa kwestia - szczególnie jeżeli nie stosuje się cache w stylu APC etc.

Natomiast większa czytelność często oznacza lepszą wydajność, bo łatwiej stworzyć optymalne struktury i algorytmy.
Tomasz Zadora

Tomasz Zadora programuję

Temat: Walidacja formularzy po której stronie?

W Javie można przy pomocy refleksji zrobić ObiektKlasy->setAccessible('nazwaWlasnosci'); i dostać się do prywatnych i chronionych własności.

Najpierw musisz mieć prawo żeby to zrobić, skoro masz prawo coś takiego zrobić, to żadne priv/prot już nie pomogą tutaj nie o to chodzi o czym prawdopodobni doskonale wiesz.
Btw. twój Linuksowy link jest z 2001 -> v25.4, 13 July 2001 , trochę się zdezaktualizował ;)

To co jest napisane w dolnej części jest nadal aktualne, tak jak np. wiele maksym prawa rzymskiego nadal jest wykorzystywanych chociaż są już stare.

Następna dyskusja:

Niechciane wpisy do formularzy




Wyślij zaproszenie do