Projekt MamZdanie udostępniony na licencji GNU Affero GPLv3

Projekt MamZdanie udostępniony na licencji GNU Affero GPLv3

    przez -
    8 208
    MamZdanie
    Pracownia Badań i Innowacji Społecznych Stocznia i firma Pretius ogłosiły udostępnienie kodu projektu MamZdanie na licencji GNU Affero GPLv3. Był on używany do hostowania portalu mamzdanie.org.pl, który to jest pierwszym polskim serwisem, dedykowanym do publicznych konsultacji. Cały kod jest dostępny w serwisie GitHub, a specjalne podziękowania w przekonywaniu do przejścia na wolną licencję, należą się Jarkowi i Alkowi.

    Podobne artykuły

    • Pingback: Archiwum Projekt MamZdanie udostępniony na licencji GNU Affero GPLv3()

    • piotrek

      mam pytanie do tzw "javowców" (pytam z ciekawości a nie ironizuję ;))

      patrząc na ten plik:
      https://github.com/pretius/mamzdanie/blob/master/

      czy konieczne jest pokrywanie metod w klasie dziedzicznej które i tak nie robią nic oprócz odwoływania się do klasy bazowej? Czy nie taki sam efekt uzyskalibyśmy po prostu extendując klasę, bez pokrywania metod?
      https://github.com/pretius/mamzdanie/blob/master/

      dlaczego tak dużo jest domyślnych geterów i seterów? Skoro nie ma walidacji (setter po prostu podstawia _private costam = value czyli defacto możemy podstawić tam co chcemy) nie prościej byłoby zrobić pola na public? W tym momencie jest ogromna ilość kodu który totalnie nic nie robi.

      • Copy

        Wydaje mi się że odpowiedź jest wspólna dla wszystkich obiektowych języków.
        1. Nie zawsze dziedziczenie jest tym co chcemy. Często zawieranie obiektów innych klas jest dużo lepsze. Zależy od danego przypadku.
        2. Jeśli te pola były by public i później chciałbyś zrobić walidację to musiałbyś je ukryć. A tak udostępniasz interface, który później możesz zmieniać jak chcesz. A programista użytkownik będzie miał zawsze działający kod bez żadnych modyfikacji.

      • piotrek

        ad 1.
        no tak, tylko tu chodzi mi o to, że w tym konkretnym przypadku jest wywoływane super(). Co daje mi do myślenia, że te domyślne konstruktory muszą występować w klasie PortalException bo inaczej kod by się wysypał. Chodziło mi tylko o to po co wywoływać konstruktor klasy poprzedniej ? Skoro przekazywane jest np. super() to znaczy że wywoływany jest domyślny konstruktor klasy PortalException. Dlaczego więc wogóle jest pokryty domyślny konstruktor? skoro jego ciało jest puste (bo ogranicza się tylko do wywołania parenta). Troszkę wygląda mi to na sytuację jakby kod tego exceptiona nie był stworzony przez programistę tylko jakby IDE z automatu wygenerowało metody na podstawie klasy rodzica.

        ad 2. Ok, rozumiem argument ze spójnością kodu. Szkoda w takim razie, że klasa pod spodem (wiem, tu nie ma żadnej, jest interfejs ;)) nie implementuje takiej funkcjonalności:

        wartosc = obiekt->getPole()

        co byłoby tłumaczone na

        wartosc = obiekt->defaultowyGetter("pole");

        chyba, że byłby pokryty getter.

        chodzi mi po prostu o to, że mamy całą masę kodu który tak naprawdę nic nie robi.

      • norbert

        Polecam książkę "Czysty kod" ;)

      • mikolajs

        "dlaczego tak dużo jest domyślnych geterów i seterów? Skoro nie ma walidacji (setter po prostu podstawia _private costam = value czyli defacto możemy podstawić tam co chcemy) nie prościej byłoby zrobić pola na public? W tym momencie jest ogromna ilość kodu który totalnie nic nie robi. "

        Pola public łatwo mogą być przyczyną prostego błędu, mając metodę do ustawienia i pobrania pola klasy raczej nie pomylisz się. Do tego, jeśli nawet w tej chwili nie ma walidacji to nie znaczy, że w przyszłości nie będzie. Jeśli masz getter i setter, to w każdej chwili możesz dodać walidację, a ktoś kto używa Twojego kodu nie zauważy nawet zmiany. Poza tym, nie zawsze przekazuje się po prostu pole klasy, getter może wybierać jakieś dane z klasy lub nawet kilku pól. W każdej chwili możesz zmienić wewnętrzną implementacje struktur danych, zostawisz tylko te same publiczne metody (w tym gettery i settery) i użytkownik kodu może nawet o tym nie wiedzieć, nie musi przepisywać swojego kodu.

      • mikolajs

        "Czy konieczne jest pokrywanie metod w klasie dziedzicznej które i tak nie robią nic oprócz odwoływania się do klasy bazowej? Czy nie taki sam efekt uzyskalibyśmy po prostu extendując klasę, bez pokrywania metod? "
        Chyba chodzi Ci o konstruktory? Pierwszy konstruktor bezparametrowy byłby automatycznie generowany gdyby nie pozostałe. W tym bezparametrowym, można by było nie pisać super() bo i tak kompilator dopisałby to wywołanie. W subklasie nie musisz chcieć aby były wszystkie konstruktory identyczne z superkasą, kompilator o tym nie wie. O ile pamiętam to w C++ jest chyba podobnie.
        A tak w ogóle to piszę głownie w Scali, więc mogę się mylić ;)

      • Gerard Stańczak

        btw mozecie zadawać takie pytania również na forum http://osworld.pl/forum
        które bądź co bądź po to powstało =)