Этот вопрос несколько не зависит от языка, но не полностью, поскольку объектно-ориентированное программирование (ООП) отличается, например, в Java , которая не имеет функций первого класса, чем в Python .
Другими словами, я чувствую себя менее виноватым за создание ненужных классов в таком языке, как Java, но я чувствую, что может быть лучший способ в менее шаблонных языках, таких как Python.
Моя программа должна выполнить относительно сложную операцию несколько раз. Эта операция требует много «бухгалтерии», должна создавать и удалять временные файлы и т. Д.
Вот почему также необходимо вызывать множество других «подопераций» - складывать все в один огромный метод не очень приятно, модульно, читабельно и т. Д.
Вот такие подходы, которые приходят мне в голову:
1. Создайте класс, который имеет только один открытый метод и сохраняет внутреннее состояние, необходимое для подопераций, в своих переменных экземпляра.
Это будет выглядеть примерно так:
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.
Проблема, которую я вижу с этим подходом, состоит в том, что состояние этого класса имеет смысл только внутри, и он не может ничего делать со своими экземплярами, кроме как вызывать их единственный открытый метод.
# 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. Создайте группу функций без класса и передайте различные внутренние переменные между ними (в качестве аргументов).
Проблема, которую я вижу с этим, состоит в том, что я должен передать много переменных между функциями. Кроме того, функции будут тесно связаны друг с другом, но они не будут сгруппированы вместе.
3. Как 2. но сделайте переменные состояния глобальными вместо их передачи.
Это было бы совсем нехорошо, так как мне приходилось делать операцию более одного раза с другим вводом.
Есть ли четвертый, лучший подход? Если нет, какой из этих подходов будет лучше и почему? Я что-то упускаю?