To pytanie jest nieco niezależne od języka, ale nie do końca, ponieważ programowanie obiektowe (OOP) różni się na przykład w Javie , która nie ma funkcji pierwszej klasy, niż w Pythonie .
Innymi słowy, czuję się mniej winny z powodu tworzenia niepotrzebnych klas w języku takim jak Java, ale wydaje mi się, że może istnieć lepszy sposób w mniej popularnych językach, takich jak Python.
Mój program musi kilkakrotnie wykonać stosunkowo złożoną operację. Ta operacja wymaga dużo „księgowości”, musi tworzyć i usuwać niektóre pliki tymczasowe itp.
Dlatego też musi wywoływać wiele innych „podoperacji” - umieszczenie wszystkiego w jednej ogromnej metodzie nie jest zbyt ładne, modułowe, czytelne itp.
Teraz przychodzą mi na myśl podejścia:
1. Stwórz klasę, która ma tylko jedną metodę publiczną i zachowuje wewnętrzny stan wymagany dla podoperacji w zmiennych instancji.
Wyglądałoby to tak:
class Thing:
def __init__(self, var1, var2):
self.var1 = var1
self.var2 = var2
self.var3 = []
def the_public_method(self, param1, param2):
self.var4 = param1
self.var5 = param2
self.var6 = param1 + param2 * self.var1
self.__suboperation1()
self.__suboperation2()
self.__suboperation3()
def __suboperation1(self):
# Do something with self.var1, self.var2, self.var6
# Do something with the result and self.var3
# self.var7 = something
# ...
self.__suboperation4()
self.__suboperation5()
# ...
def suboperation2(self):
# Uses self.var1 and self.var3
# ...
# etc.
Problem, jaki widzę w tym podejściu, polega na tym, że stan tej klasy ma sens tylko wewnętrznie i nie może nic zrobić z jej instancjami, z wyjątkiem wywołania ich jedynej publicznej metody.
# Make a thing object
thing = Thing(1,2)
# Call the only method you can call
thing.the_public_method(3,4)
# You don't need thing anymore
2. Utwórz kilka funkcji bez klasy i przekaż między nimi różne wewnętrznie potrzebne zmienne (jako argumenty).
Problem, jaki tu widzę, polega na tym, że muszę przekazywać wiele zmiennych między funkcjami. Ponadto funkcje byłyby ściśle ze sobą powiązane, ale nie byłyby zgrupowane razem.
3. Podobnie jak 2., ale zmienne globalne należy wprowadzać zamiast przekazywać.
To nie byłoby w ogóle dobre, ponieważ muszę wykonać operację więcej niż raz, z różnymi danymi wejściowymi.
Czy istnieje czwarte, lepsze podejście? Jeśli nie, to które z tych podejść byłoby lepsze i dlaczego? Czy czegoś brakuje?