• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zadanie do rozwiąznia w .NET Core

Object Storage Arubacloud
0 głosów
512 wizyt
pytanie zadane 23 września 2022 w C# przez KonTar Początkujący (440 p.)
edycja 23 września 2022 przez KonTar

Hej!smiley

chciałbym zapytać Was o radę odnośnie rozwiązania pewnego zadania, które pojawiło mi się ostatnio na rekrutacji na stanowisko juniora.

Mianowicie miałem zaprojektować mechanizm dodawania tasków dla programistów na tablicy kanbanowej. Kto nie wie jak wygląda, to już tłumaczę. Mamy kilka kolumn, między którymi przeciągamy naszego taska w zależności od jego statusu. Statusem może być to "Open", "In Progress", "Done", "To Do", "In Review", "Under review", "Approved", "Cancelled". Problemem nie jest jednak stworzenie listy rozwijanej ze wszystkimi dostępnymi statusami, ale mechanizm, który oprogramuje walidacje na te statusy - tzw flowindecision. To znaczy, "Open" może przejść tylko na "To Do" albo "Cancelled". "In Progress" może przejść tylko na "In Review" lub "Cancelled". "Cancelled" może przejść tylko na "Open" itp.

Moje pytanie: jak to zaprojektować w SQL jako tabelę, a później oprogramować w EF, żeby zapisywał to do bazy?

Moja próba rozwiązania to była tabelka asocjacyjna, która zawiera relację wiele-do-wiele. Ale to dziwne, że w jednej tabelce miałbym zawrzeć dwa klucze obce (FK TaskStatusId, FK NextTaskStatusId) do tej samej tabelki, jaką jest TaskStatusDictionary... Później próbując to zaprojektować w EnityFramework Core mam duże problemy z implementacją...crying

Dziękuję za poświęcony czas.

Pozdrawiam


PS: Jeśli ktoś ma pytania lub drobne uwagi, to proszę o komentarz do posta. Jeśli ktoś wie jak to rozwiązać, to proszę o odpowiedź. (zgodnie z art. II pkt. 4 regulaminu forum).

1
komentarz 23 września 2022 przez Wiciorny Ekspert (272,330 p.)
Strasznie przekombinowałeś, nie wiem coś ty wymyślił, ale totalnie nie tak ... i za dużo niepotrzebnych rzeczy chcesz zrobić. Wieczorem, napisze kilka sugestii
komentarz 23 września 2022 przez KonTar Początkujący (440 p.)

Aaa... czyli raczej nie dostanę tej pracy...frown Jasne, dzięki! smiley

1 odpowiedź

+1 głos
odpowiedź 23 września 2022 przez marcin99b Szeryf (82,260 p.)
wybrane 25 września 2022 przez KonTar
 
Najlepsza
jeśli zawsze jest sztywna kolejność i na pewno nigdy nie będzie tutaj żadnych zmian (czyli nierealny scenariusz w naszym świecie), to możesz przypisać numery statusów, łatwo to zrobić za pomocą enuma

Cancelled = 0
Open = 1,
ToDo = 2,
InProgress = 3
i tak dalej

i każdy status możesz zmienić TYLKO na status większy o 1, czyli z 2 nie możesz zrobić 4, z 2 możesz zrobić tylko 3 LUB 0 (bo 0 to cancelled)

jak przykryjesz to pod enumami to możesz dodać metode Cancel() która ustawia status 0 i metode NextStatus() która dodaje 1 do statusu, jeśli nie jest maksymalny (pod spodem enuma będzie int, więc można bez problemu dodawać)

wtedy też można łatwo cofać status, bo po prostu odejmujesz 1 (tylko trzeba uważać na 0, bo cancelled)

ale tak jak na początku napisałem, co jeśli wymagania sie zmienią... wtedy już jest kombinowanie z tym że każdy status ma liste statusów w które może sie zmienić
1
komentarz 23 września 2022 przez Wiciorny Ekspert (272,330 p.)
Kanban ma zawsze sztywną kolejność, bo to jest kanban.
Generalnie "ticket" powinien być obiektem a status wartością/polem tego obiektu wtedy nie ma problemu bo jeśli nawet to jest enum globalny, to zmiana pola wartości obejmuje niezaleznie wszystkie obiekty które z niego korzystają i w łatwy sposób można nadać wykluczenia, jęśli takowy czegoś nie spełnia.

Status może ulec zmianie np. z punktu In In Progress na To Do, kiedy zrezygnowano z jego implementacji i dalej nie ma to rzadnego problemu aby była jak sam piszesz funkcja dodatkowa, która za taka operacje w prosty sposób będzie odpowiadać.
komentarz 23 września 2022 przez KonTar Początkujący (440 p.)

@marcin99b, niestety zadania na juniora są bardziej skomplikowane (a coraz więcej wymaga się na stanowisko juniora) niż te, które miałem na pierwszym roku studiów informatycznychcool. Generalnie mechanizm powinien być napisany tak, żeby do niego nie wracać. Moja pierwsza myśl była taka, żeby zrobić konfigurację po stronie bazy danych w tabelce. W takiej tabelce można by jednym "update'em zmienić walidacje tych danych i dostosować je do np ... nowo dodanego statusu w kanbanwink

komentarz 23 września 2022 przez Wiciorny Ekspert (272,330 p.)

Moja pierwsza myśl była taka, żeby zrobić konfigurację po stronie bazy danych w tabelce.

żartujesz  1 updatem chcesz strzelać do bazy ? bo ktoś zmienił pozycje elementu którego stan trzymać powinna tylko aplikacja a nie baza? :D 
 Totalnie nie i to zadanie jest banalne, wymaga przemyślenia ale nie jest to nic skomplikowanego, a Ty właśnie to komplikujesz. 
programowanie ma być jak najprostsze, jak najbardziej czytelne i  przede wszystkim realizować zamierzony cel, a nie być " pokazem umiejętności" które tylko  pogorszy sprawę. 
baza tutaj totalnie nie ma nic wspólnego, zadanie brzmi "zaimplementować MECHANIZM"- praktycznie API a nie całą aplikacje, nawet jeśli to update - ma być updatem a nie "spagetti kodem" i ma być w swojej istocie operacją czystą czyli wykonywać to co ma wykonywać a nie robić wszystko dookoła. 

Interakcja z bazą powinna być tylko przy zapisach, pobraniach a nie kiedy obiekt jest dostępny w warstwie klienta i zmienia swój stan który to powinien być tylko DLA OBIEKTU, stan nie przechowuje baza, ani jednocześnie jesli potrzebny jest stan w ramach sesji to jest on trzymany w cache

( i żeby ktoś mnie nie zwyzywał, ja nie minusowałem odp na pytanie, bo jest ona  pomocna i Enum jest dobrym rozwiązaniem)

komentarz 23 września 2022 przez KonTar Początkujący (440 p.)

Co to znaczy "warstwa klienta"? Chodzi o tę część przeglądarki? (HTML/JS). Mam wrażenie że nie zrozumiałeś mojej koncepcjicheeky

  1. TaskStatusDictionary - przechowuje wszystkie istniejące statusy - Id, Name.
  2. PossibleTaskStatus - przechowuje dwa klucze: FK TaskStatusDictionaryId, FK NextTaskStatusDictionaryId. Czyli pary: (1, 2), (1,7), (2,2), (2,7), ... (7,1).

Koncepcja była taka, żeby pobierać z PossibleTaskStatus statusy, JOIN-ując je z tabelką  TaskStatusDictionary i przesyłać je do np selecta, żeby on to jakoś odfiltrował użytkownikowi po stronie klienta.

Dzięki tabelce PossibleTaskStatus  możemy INSERTować i UPDATEować w naszej bazie relacje między statusami. I to by wystarczyło, gdyby dorzucić dodatkowy status do TaskStatusDictionary. Bez pisania dodatkowego kodu.

1
komentarz 24 września 2022 przez marcin99b Szeryf (82,260 p.)

@KonTar, 

niestety zadania na juniora są bardziej skomplikowane (a coraz więcej wymaga się na stanowisko juniora) niż te, które miałem na pierwszym roku studiów informatycznych

Pewnie dlatego że z roku na rok jest coraz więcej łatwo dostępnej i fajnie przedstawionej wiedzy w internecie, nauka jest coraz prostsza. Ostatnio kolega zaczynał sie uczyć programowania i aż byłem pod wrażeniem jak teraz wygląda "świat początkujących"

Jak ja zaczynałem nauke, czyli okolice 2015/2016, musiałem się przedzierać przez słabej jakości poradniki, brzydkie strony i można powiedzieć że pewnego rodzaju chaos. Znalezienie poradnika do wielu rzeczy oznaczało słuchanie trzeszczącego mikrofonu albo wersje demo płatnego kursu. Oczywiście dało się wszystkiego nauczyć z samych darmowych materiałów, ale trzeba było kombinować z szukaniem.

Kolega jak sie uczy, to od pierwszego dnia ma gotowe rozpisane ładne grafiki z opisami i linkami, z ścieżką nauki. Do tego prawie wszystkie poradniki na które trafia to kompletne opisy wszystkiego, opisane w fajny i przyjazny sposób. Jak ogląda coś na youtube to ma bardzo dużo serii poradników które prowadzą go przez wiele tematów i na start wie że istnieją rzeczy, o których istnieniu ja dowiadywałem się np po roku nauki. Do tego praktycznie każdy poradnik na youtube to przyjemny głos i ciekawie zmontowany film, w którym przez pół godziny nie oglądasz jak typ męczy sie z naprawieniem jakiegoś drobnego błędu i boisz sie przewinąć żeby czegoś nie stracić - tylko autor sam to ucina i pokazuje ci same wartościowe rzeczy.

Teraz nauka to nie wyzwanie tylko bycie prowadzonym za rączke, tylko wystarczy włożyć w to określoną liczbe godzin... więc nic dziwnego, że pracodawcy wymagają więcej niż kiedyś... chociaż jak czytam historie wielu juniorów, przez jakie hardkorowe rozmowy przechodzą, to mam wrażenie że na moich pytali mnie o trudniejsze rzeczy 

No a na studiach nic sie nie zmienia, cały czas to samo, pamiętam że jak zaczynałem studia to większość książek dla mojego roku była z przedziału 1970-2000, najnowsza jaką udało mi się znaleźć była z 2005 

1
komentarz 24 września 2022 przez marcin99b Szeryf (82,260 p.)
  1. PossibleTaskStatus - przechowuje dwa klucze: FK TaskStatusDictionaryId, FK NextTaskStatusDictionaryId. Czyli pary: (1, 2), (1,7), (2,2), (2,7), ... (7,1).

A czy takie kombinacje będą możliwe?
Bo z tego co rozumiem, z każdego statusu musi być opcja zmiany na Cancelled, plus każdy status można zmienić tylko na następny

Czyli
Open może przejść jedynie w Cancelled i ToDo
ToDo może przejść jedynie w Cancelled i InProgress
i tak dalej
czyli ja tu widze zwykłe dodawanie statusu += 1

można opcjonalnie dodać możliwość cofania statusu i wtedy masz -= 1

po co bawić sie w dodatkowe tabelki i dodatkowe zapytania do bazy, skoro można zrobić najprostsze dodawanie i zapisywać w bazie zaktualizowany stan

jeśli okaże sie że dojdzie jedna wartość więcej do statusu i trzeba będzie zmigrować dane, np wszystkie statusy od 3 w góre muszą podskoczyć o 1, bo na miejsce 3 wchodzi nowy status (kolumna)... to sie robi migracje bazy podczas releasu nowej wersji

komentarz 24 września 2022 przez KonTar Początkujący (440 p.)

Hmm... No dobrze, zwracam honor - ta wersja powinna być wystarczająca żeby to działało w prosty sposób!smiley. Nie wiem, może za bardzo nastawiłem się na konfigurację zależności po stronie bazy danych, choć to rozwiązanie byłoby trudniejsze do zrealizowania i raczej nie na warunki aplikacji na zadanie rekrutacyjne. Ale napiszę sobie w wolnym czasie jakiegoś Task Managera w C#, żeby przećwiczyć ten problem.


A tak swoją drogą, czy tabela, która zawiera dwa klucze obce, wskazujące na tą samą tabelkę jest OK? To nie podchodzi pod jakąś złą praktykę? A skoro nie, to czy EF Core nie powinien tego ogarnąć?

1
komentarz 25 września 2022 przez marcin99b Szeryf (82,260 p.)

czy tabela, która zawiera dwa klucze obce, wskazujące na tą samą tabelkę jest OK?

Jeśli działa dobrze to znaczy że jest ok, dałoby się dużo takich rzeczy rozwiązać ładniej, ale kosztem większej ilości tabel, danych i co ostatecznie za tym idzie - mniejszej wydajności

Jeśli to drobne rozwiązanie to można zrobić to najprościej i przebudować jak okaże się, że trzeba wszystko rozbudować

Najważniejsze żeby baza była łatwo rozszerzalna i wydajna (na poziomie zapytań do bazy bardzo łatwo rozwalić wydajność aplikacji... mam wrażenie że najłatwiej)

========

A, i taka dość ważna rzecz co do tego "Jeśli to drobne rozwiązanie to można zrobić to najprościej" bo mnóstwo osób, nawet teoretycznie doświadczonych tego nie ogarnia i później powstaje coś co sie nazywa Demo Driven Development, czyli robienie mini gównianego prototypu który ma jedynie działać, nawet jeśli ma się wiedzę o tym jak ma wyglądać wersja docelowa.

Jeśli wiesz jak ma wyglądać wersja docelowa, albo masz przynajmniej ogólne informacje, lepiej jest projektować wszystko już z myślą o tej wersji docelowej, żeby nie tracić czasu na zbędne przebudowy, przez które często do finalnej wersji wchodzą ograniczenia z początków pisania kodu (bo nie wszystko się poprawi, albo część rzeczy ciężko już przebudować itd).

Mini prostą wersję powinno się robić jedynie, jeśli potrzebujesz komuś na szybko przedstawić prototyp, bo nie wiadomo czy takie rozwiązanie w ogóle ma sens (a w wielu przypadkach jest to już potwierdzone wieloma analizami i ten etap jest zbędny lub częściowo zbędny - zamiast prototypu można pokazać wczesny etap rozwoju i też będzie okej), lub jeśli do końca nie wiadomo co chce się osiągnąć, ale ma się jakiś wstępny trop, więc chce się stworzyć coś prostego na szybko, co będzie użyteczne i dopiero później pomyśli się jak dalej można to rozwinąć

komentarz 25 września 2022 przez KonTar Początkujący (440 p.)

Jeśli wiesz jak ma wyglądać wersja docelowa, albo masz przynajmniej ogólne informacje, lepiej jest projektować wszystko już z myślą o tej wersji docelowej, żeby nie tracić czasu na zbędne przebudowy, przez które często do finalnej wersji wchodzą ograniczenia z początków pisania kodu (bo nie wszystko się poprawi, albo część rzeczy ciężko już przebudować itd).

Słyszałem kiedyś od pewnego programisty, że powinniśmy pisać tak by już do tego nie wracać, ale też wypominał o tym, żeby starać się przewidywać rozwój aplikacji pomimo tego, że obecnie klient o tym nie wspomina w swoich wymaganiach. Wyłapanie takich rzeczy może sporo ułatwić życie.

Generalnie dzięki za te wszystkie protipy - wysyłam lajeczkasmiley.

PS: A tak z ciekawości jeszcze dopytam, jakich można spodziewać się zadań rekrutacyjnych na juniora? Bo akurat pytań można się nauczyć na pamięć, a słyszałem że jednak ważna jest praktyka i to, jak radzimy sobie z nią na rozmowie o pracę.

1
komentarz 25 września 2022 przez marcin99b Szeryf (82,260 p.)
To już zależy od kreatywności ludzi

Ja nigdy nie miałem zadań rekrutacyjnych (mimo że rekrutacji zaliczyłem kilkadziesiąt), bo zawsze miałem coś ciekawego do pokazania na githubie - polecam ten sposób, bo lepiej zrobić jeden projekt który jako tako pokazuje twój poziom, niż przy każdej rekrutacji osobno udowadniać to samo, jak sie chodzi na dużo rekrutacji to myśle że to może być uciążliwe

Podobne pytania

0 głosów
1 odpowiedź 248 wizyt
pytanie zadane 20 września 2020 w C# przez Szyszka Gaduła (3,490 p.)
0 głosów
0 odpowiedzi 454 wizyt
pytanie zadane 17 września 2020 w C# przez Szyszka Gaduła (3,490 p.)
0 głosów
1 odpowiedź 362 wizyt
pytanie zadane 29 października 2019 w C# przez JakSky Stary wyjadacz (14,770 p.)

92,689 zapytań

141,601 odpowiedzi

320,091 komentarzy

62,048 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...