MamPytanie Opublikowano 3 Marca 2022 Udostępnij Opublikowano 3 Marca 2022 Hejka, jest tu jakiś Pythonowiec? Posiadam obiekt który odpowiada za pliki projektu. Tzn spina wszystko w całość(backupy, pliki projektu itp.). Posiada on zasadniczo trzy, interesujące nas w tym momencie zadania(inne nie mają wpływu na zagadnienie): > Utwórz projekt i zapisz jego pliki w danej lokalizacji > Wczytaj projekt z określonej lokalizacji > Zapisz zmiany w projekcie(oddzieliłem ponieważ taka metoda nie wymaga aż tak dużej ilości argumentów, wykonuje dużo mniej operacji, poza tym nie zmienia wartości które wymagane są do podania jako argumenty pierwszej metody) W teorii wszystko gra, tylko, że: > Nie można w konstruktorze przyjąć określonej listy argumentów i wykonać tworzenia bądź wczytywania projektu ponieważ nie wiadomo jeszcze co programista zamierza zrobić - utworzyć nowy, czy wczytać istniejący projekt(a więc wiele wartości które przy tworzeniu są wymagane jako argumenty pobrać z plików projektu). > Jeśli konstruktor nie będzie przyjmował żadnych argumentów(wydawało by się to najlepsze rozwiązanie) to można by zrobić potem object.load bądź object.create, ale wtedy gdyby ktoś skorzystał z object.save_changes zanim wczytałby pliki projektu lub utworzył projekt, mogłoby dojść do błędu ponieważ wiele potrzebnych zmiennych nie byłoby utworzonych. Można by wtedy rzucić wyjątkiem, ale nie jestem pewien czy to nie byłoby sprzeczne z normami które stosujemy w Pythonie. Nie powinno być chyba tak, że jedna metoda wyrzuca wyjątek i odmawia współpracy, jeśli wcześniej nie wywołamy innej. > Myślałem o przeładowaniu w konstruktorze tak, aby tworzona instancja obiektu mogła(w zależności od podanych argumentów) być jednocześnie tworzeniem projektu bądź jego wczytywaniem. Natomiast mam wrażenie - być może nie prawdziwe - że w Pythonie unika się stosowania przeładowań(w przeciwieństwie do Javy czy C#), a już szczególnie w konstruktorze. Nie wiem też, czy takie coś byłoby odpowiednio intuicyjne dla programisty. Mam wrażenie, że lepiej byłoby robić instance = object() i potem object.load(argumenty metody) bądź object.create(argumenty metody). Natomiast nie wiem jak to wszystko zrobić tak, aby to było zgodnie ze sztuką. Chell 1 Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Filar Społeczności Chell Opublikowano 6 Marca 2022 Filar Społeczności Udostępnij Opublikowano 6 Marca 2022 fajne pytanie. Na pewno przeładowanie konstruktora to kiepski pomysł, implementacja dwóch zupełnie różnych funkcjonalności w ramach jednej metody będzie strasznie myląca. Druga opcja jak najbardziej spoko, jeżeli stan instancji nie pozwala na save_changes to programista nie powinien tego wywoływać na tym etapie. Jak chcesz to zrobić super, to możesz sobie wygooglować "builder design pattern" - to koncept klasy-serwisu służacego do budowania instancji innej klasy, gdy proces ten jest złożony. Nie implementowałem go jeszcze żeby obsłużyć dwa różne flow instancjonowania, bo nie do końca do tego służy, ale myślę że by się całkiem spoko nadał dla tego case class ProjectBuilder: def __init__(self): self._instance = Project() def load_from_path(self, str: path) -> self: ... self._instance = instance return self def set_files(self, list: files) -> self: self._instance.files = files return self def set_name(self, str: name) -> self: self._instance.name = name return self def get_instance(self) -> Project: if not self._instance.name or not self._instance.files: raise Error('The instance is incomplete.') return self._instance celem takiego buildera jest zwrócenie Ci instancji która ma już stan który Ci pasuje gnysek 1 Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się