Skocz do zawartości

Python - load i save project


MamPytanie

Rekomendowane odpowiedzi

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ą.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności

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

Odnośnik do komentarza
Udostępnij na innych stronach

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ę
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...