Problem ze strukturą projektu. Podejście obiektowe.

Problem ze strukturą projektu. Podejście obiektowe.

Wątek przeniesiony 2019-01-17 11:46 z Algorytmy i struktury danych przez somekind.

K1
  • Rejestracja:około 6 lat
  • Ostatnio:około 5 lat
  • Postów:7
0

Posiadam klasę BazaPrzestępstw ma ona w sobie liste obiektów typu Osoba. Każda Osoba ma w sobie listę obiektów typu Przestępstwo. Przestępstwo posiada datę nadania. Problem jak w najlepszy sposób i gdzie stworzyć metodę usuwającą przestępstwo po 15 latach?

edytowany 1x, ostatnio: kowal1996228
Aventus
  • Rejestracja:około 9 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:UK
  • Postów:2235
1

Powiedział bym Ci ale skoro sprawa dotyczy prawa karnego to takich rzeczy nie zamieszcza się publicznie.

A tak serio to skoro masz obiekt reprezentujący jaka zbiór danych (a więc repozytorium/bazę) to właśnie tam powinieneś mieć metodę za pomocą której możesz usunąć obiekty.

EDIT: nie doczytałem. Skoro chodzi o usunięcie przestępstw to taka logikę powinienna posiadać Osoba. Z tym że powodem dla którego nie jest to dla Ciebie jasne jest to że próbujesz użyć oddzielnej klasy do reprezentowania bazy, mimo że (zakładam) rzeczywistej bazy nie masz. Normalnie chodziło by o usunięcie przestępstwa z osoby, a następnie zapisanie tej osoby raz jeszcze, tym razem ze zaktualizowaną liczbą przestępstw.


Na każdy złożony problem istnieje rozwiązanie które jest proste, szybkie i błędne.
edytowany 3x, ostatnio: Aventus
K1
  • Rejestracja:około 6 lat
  • Ostatnio:około 5 lat
  • Postów:7
1

To nie ma totalnie nic związanego z prawem karym, taki sobie projekt wymyśliłem. Równie dobrze można zmienić BazaOsóbKtórychLizakNadajeSięDoZjedzenia a listę Przestępst zamienić na listę Lizaków gdzie każdy Lizak ma datę produkcji. Po 2 tygodniach lizak nie nadawać się do zjedzenia więc trzeba go usunąć i tyle :)

Aventus
Żarcik :)
elwis
  • Rejestracja:ponad 18 lat
  • Ostatnio:17 dni
0

Myślę, że taka metoda powinna się znaleźć w klasie kontenera przechowującego. Usuwałaby ona wszystkie przedawnione sprawy.


Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
2

Ja bym powiedział że nigdzie. Usuwanie danych to zwykle niepożądana rzecz. Ja bym jednak zaimplmentował pobieranie danych tak zeby filtrowało te przedawnione wpisy.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
Berylo
  • Rejestracja:ponad 7 lat
  • Ostatnio:4 miesiące
  • Postów:344
0

Moim zdaniem powinien znajdować się jakiś job/cron, który co x czasu sprawdzałby przestępstwa i flagował je jako przedawnione. Osoba nie powinna sama zarządzać swoimi przestępstwami, tak naprawdę to czasem przedawnienia zarządza hmm czas ;) Ewentualnie jakiś sąd czy coś w ten deseń. W każdym razie jest to zewnętrzna instytucja/proces, co popiera mój pomysł.
Tak jak @Shalom napisał, nie powienieś tego usuwać, a raczej dodaj flagę w klasie Przestępstwo boolean expired. Ewentualnie dodaj drugą listę w stylu przeterminowanePrzestępstwa i w przypadku przedawnienia przenoś z jednej do drugiej.

jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:minuta
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
2

Crony i inne tego typu rozwiązania, w tym przypadku to zwykle średni pomysł. Joby mogą się nie odpalić. Ktoś może pechowo ustawić złą datę na serwerze. Potem zostajemy z expired = true, ale nie wiadomo dlaczego. Raczej warto w **Przestępstwach ** wpisać datę wygaśnięcia i filtrować po tym (względem aktualnej daty). Aczkolwiek mogą tu wchodzić jakieś regulacje prawne. Nie znam się na tym.


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 3x, ostatnio: jarekr000000
hcubyc
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 2 lata
0
Shalom napisał(a):

Ja bym powiedział że nigdzie. Usuwanie danych to zwykle niepożądana rzecz. Ja bym jednak zaimplmentował pobieranie danych tak zeby filtrowało te przedawnione wpisy.

Od bidy można by przenosić do osobnej tabeli/kolekcji/storage'u


Limitations are limitless > ##### Ola Nordmann napisał(a)
> Moim językiem ojczystym jest C++ i proszę uszanować to, że piszę po polsku.
TA
  • Rejestracja:około 7 lat
  • Ostatnio:około 9 godzin
  • Postów:266
1

Nie zgadzam się z tymi, którzy twierdzą, że w ogóle nie należy kasować wpisów. W polskich przepisach istnieje pojęcie "zatarcie skazania". I program powinien dać możliwość skasowania - nie polemizować z obowiązującymi z przepisami, tylko umożliwić działanie z nich wynikające.

A odnośnie tego, do którego z zaproponowanych obiektów przypisać funkcjonalność kasowania. Wyobraźmy sobie postać analogową problemu, że mamy papierowe archiwum z aktami. Nie pracuję w takowym, ale wyobrażam sobie jak może to funkcjonować:

  1. Usuwanie wpisów następuje w momencie, gdy ktoś sięgnął do danego zbioru danych w jakimś innym celu, przejrzał teczkę danej osoby i zauważył, że coś jest nieaktualne. Wtedy na siłę można by to przypisać obiektowi "TeczkaOsoby", chociaż i tak słabo oddawałoby to rzeczywistość, bo w rzeczywistości to pracownik archiwum czyści teczkę, a nie teczka sama siebie.
  2. Okresowo robimy coś w rodzaju remanentu i kasujemy wszystkie przedawnione przestępstwa - wtedy należałoby to zadanie przypisać całemu archiwum (czy tutaj bazie danych), a nie teczce osoby ani w żadnym razie przestępstwu.

Oczywiście, co sugeruje choćby już sam mój nick, odradzam w tym przypadku podejście "obiektowe". Chyba że jest to jakaś forma projektu, gdzie wybór metodyki ma podłoże ideologiczne a nie praktyczne (np. projekt zaliczeniowy u prowadzącego będącego wiernym wyznawcą OOP). Jak zresztą sam widzisz, nikomu w tym wątku nie udało się zaproponować sensownego i jednocześnie zgodnego z OOP podziału, tylko odpowiedzi zeszły na temat poboczny, jakim jest czy kasować wpisy czy ich nie kasować.

Berylo
myślę, że to co piszesz to duży "overthinking", to tylko przykładowe zadanie gdzie "fabuła" została dobrana przypadkowo i równie dobrze to może być implementacja szaletów miejskich, a nie prawa karnego.
TA
Pewnie wybrana przypadkowo, ale jednak wybrana. I wynikają z niej pewne szczegóły, które należałoby uwzględnić - nawet jeśli ma być to traktowane tylko jako ćwiczenie, to przynajmniej będzie to ćwiczenie w realizowaniu wymagań tego konkretnego zadania. Przecież taki cel stawiany jest przed większością programistów w pracy - podobnych ale nie identycznych problemów zostało rozwiązane mnóstwo, a teraz trzeba uwzględnić szczegóły tego konkretnego. (chociaż niestety są i tacy polemizujący z wymaganiami, bo po ich realizacji mają niższą "jakość kodu")
YA
Zgadzam się co do kasowania wpisów. (Nie)Kasowanie wpisów w jakimś systemie to tylko jeden z aspektów problemu. Jeśli "proces biznesowy" oprócz inwentaryzacji w systemie przewiduje manualne wzięcie akt, wyciągnięcie z nich strony i przepuszczenie jej przez niszczarkę do dokumentów, a następnie dokonania jakiegoś wpisu w jakimś rejestrze "zatarto skazanie nr XYZ", to kliknięcie guzika "Usuń", w systemie, który robi "soft delete" jest słabe ;-) Niezależnie od metodyki projektowania softu, bez znajomości "biznesu" wyjdzie tak jak się projektantowi wydaje. Mimo chęci często qpa
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
2

Nie zgadzam się z tymi, którzy twierdzą, że w ogóle nie należy kasować wpisów. W polskich przepisach istnieje pojęcie "zatarcie skazania". I program powinien dać możliwość skasowania - nie polemizować z obowiązującymi z przepisami, tylko umożliwić działanie z nich wynikające.

Nadinterpretujesz przepisy. Takie zatarcia oznacza że z prawnego punktu widzenia (!) skazane nie miało miejsca i jesteś traktowany jako osoba która nigdy nie miała wyroku. Ale to NIE znaczy że należy nagle zniszczyć wszystkie rekordy! Przecież sądy nie palą nagle akt sprawy i nie modyfikują dzienników!
Analogicznie tutaj: sugerujemy żeby dane w taki czy inny sposób oznaczyć jako "usunięte" czy "nieaktywne", ale fizycznie nie usuwać ich z systemu.

To jest generalnie powszechnie przyjęta praktyka i zaręczam że większość systemów nigdy twoich danych nie usuwa, nawet jeśli "skasujesz konto". Wyjątek w tej chwili stanowi RODO, bo faktycznie pewne informacje, na wyraźne żądanie, należy teraz kasować. Niemniej nadal nie kasuje się kont użytkowników, tylko podmienia dane na placeholdery.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
john_klamka
ja tam zawsze powtarzam, że historia jest niemutowalna
TA
Tak sobie poteoretyzuję odnośnie spraw karnych, bo nie znam praktyki: myślę, że są sprawy traktowane jako bardzo ważne i ich akta są kopiowane w inne miejsca - ale od razu, nie w momencie gdy się przedawniają / następuje zatarcie skazania - i archiwizowane dłużej. Natomiast nie podejrzewam, żeby dotyczyło to wszystkich przestępstw, albo chociaż ich większości. Tutaj w sumie nie mamy w treści zadania informacji, czy ta baza przestępstw jest w sądzie, czy na komisariacie policji, czy jeszcze w jakimś innym miejscu i procedury będą różne.
somekind
To nie jest żadna baza przestępstw, wszystko wyjaśnienił autor: To nie ma totalnie nic związanego z prawem karym, taki sobie projekt wymyśliłem. Równie dobrze można zmienić BazaOsóbKtórychLizakNadajeSięDoZjedzenia a listę Przestępst zamienić na listę Lizaków gdzie każdy Lizak ma datę produkcji.
john_klamka
@jarekr000000: tak, ja wiem, jak fakty się nie zgadzają, to tym gorzej dla faktów :P
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)