Це питання є дещо мовно-агностичним, але не повністю, оскільки об'єктно-орієнтоване програмування (OOP) відрізняється, наприклад, 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. але зробіть змінні стану глобальними замість того, щоб передавати їх.
Це було б зовсім не добре, оскільки мені доводиться робити операцію не один раз, з різним вкладом.
Чи є четвертий, кращий підхід? Якщо ні, то який із цих підходів був би кращим, і чому? Щось мені не вистачає?