Лично я думаю, что проблема в том, что вы пытаетесь использовать функциональное программирование для решения задач, которые разработаны / заявлены для императивного программирования.3 популярные парадигмы (функциональная, императивная, объектно-ориентированная) имеют разные сильные стороны:
- Функциональное программирование делает упор на описании ЧТО должно быть сделано, обычно в терминах ввода / результата.
- Императивное программирование подчеркивает, КАК что-то делать, обычно в терминах списка и порядка предпринимаемых шагов, и состояния для изменения.
- Объектно-ориентированное программирование делает акцент на ОТНОШЕНИЯХ между сущностями в системе
Таким образом, когда вы подходите к проблеме, первым делом стоит перефразировать ее так, чтобы предполагаемая парадигма могла правильно ее решить.Кстати, в качестве бокового узла, насколько я знаю, не существует понятия «чистый ООП».Код в методах ваших классов ООП (будь то Java, C #, C ++, Python или Objective C) является обязательным.
Вернемся к вашему примеру: способ постановки вашей проблемы (сначала, затем,также, наконец) является обязательным по своей природе.Таким образом, построение функционального решения практически невозможно (без трюков, таких как побочные эффекты или монады).Точно так же, даже если вы создаете группу классов, эти классы сами по себе бесполезны.Чтобы использовать их, вы должны написать императивный код (хотя эти коды встроены в классы), который решает проблему шаг за шагом.
Чтобы переформулировать проблему:
- Ввод: Изображениетип (Полный или миниатюра), Имя изображения, файловая система
- Вывод: запрошенное изображение, файловая система с запрошенным изображением
Из новой постановки задачи вы можете решить еенапример:
def requestImage(type, name, fs) :
if type == "full" :
return lookupImage(name, fs), fs
else:
thumb = lookupThumb(name, fs)
if(thumb) :
return thumb, fs
else:
thumb = createThumbnail(lookupImage(name, fs))
return thumb, addThumbnailToFs(fs, name, thumb)
Конечно, это неполно, но мы всегда можем рекурсивно решить lookupImage, lookupThumb, createThumbnail и addThumbnailToFs примерно одинаково.
Большое примечание: создание новогоФайловая система звучит большой, но это не должно быть.Например, если это модуль на более крупном веб-сервере, «новая файловая система» может быть такой же простой, как инструкция, указывающая, где должна быть новая миниатюра.Или, в худшем случае, это может быть монада ввода-вывода, чтобы поместить миниатюру в соответствующее место.