Применение ООП / наследования к функциям - PullRequest
0 голосов
/ 10 апреля 2019

Я нахожусь в процессе миграции короткого проекта Python (2000 LOC) из процедурного стиля в стиль ООП. До сих пор я создавал классы и структуры наследования без особых проблем и считал, что подчинение правилам SOLID вполне естественно. Однако сегодня я оказался в странной ситуации:

Я написал очень общую функцию такого рода:

#unsafe, executes arbitrary query on db    
def select_anything(mysql_cursor,query):
       mysql_cursor.execute(query)

Затем я начал добавлять более удобные сорта, такие как:

#safer, select statement only   
    def select_some1(mysql_cursor,table,columns):
       mysql_cursor.execute("SELECT columns FROM table")

#safer, select statement+filter only    
    def select_some2(mysql_cursor,table,optional_columns,required_columns):
       mysql_cursor.execute("SELECT columns++required_columns FROM table WHERE required_columns are NOT NULL")

Вскоре после этого, У меня возникло сильное желание построить иерархию классов для этой функции (используя вызов для имитации функции). Начиная с универсальной функции в качестве родителя, а затем определяя специализации как дочерние, я мог бы повторно использовать код . Но это полностью нарушает ТВЕРДЫЕ правила. Например, он работает в обратном направлении, требуемом Лисковым: дочерний элемент может заменить только родитель (без учета преобразования аргументов из одного в другой)!

Говоря только об аспектах ООП, как называется этот анти-паттерн? Правильно ли вообще моделировать функции как классы (только с одним уникальным вызываемым членом) в попытке использовать методы ООП?

К вашему сведению, после некоторых раздумий я иду по пути одной сильно шаблонизированной функции с большим / большим количеством аргументов, а затем определяю отдельные более легкие / более удобные функции (так что нет ООП), которые создают аргументы и вызывают шаблонный функция. Например, функция шаблона может выглядеть так:

select_most(from_table,{columns:(where,set)}):
   # TBD
   # all arguments to be limited and safe
   # columns = selected columns
   # where = filter rule per column (combined with AND)
   # set = set statement per column
   # where and set to be a small subset of what is possible in SQL
...