Лучше ли иметь отдельные функции в глобальных или группировать их в классе? - PullRequest
3 голосов
/ 16 июня 2011

Я унаследовал код, в котором есть отдельные функции, по одной на код страны.Например,

def validate_fr(param):
    pass

def validate_uk(param):
    pass

Моя идея - создать класс, чтобы сгруппировать их и объединить код в один метод.К сожалению, это нарушает сплоченность.Другой вариант - отправить методы экземпляра?

class Validator(object):
    def validate(param, country_code):
       # dispatch 

Увы, у python нет оператора switch.

ОБНОВЛЕНИЕ: Я все еще не убежден, почему я должен оставить их как глобальные функции в моем модуле.Смешение их как методов класса кажется чище.

Ответы [ 4 ]

4 голосов
/ 16 июня 2011

Я бы сохранил функции на уровне модуля - нет необходимости в классе, если вы не хотите создавать его экземпляр в любом случае.Оператор switch можно легко смоделировать с помощью диктитона:

def validate_fr(param):
    pass

def validate_uk(param)
    pass

validators = {"fr": validate_fr,
              "uk": validate_uk}

def validate(country_code, param):
    return validators[country_code](param)

Учитывая схему именования, вы также можете сделать это без словаря:

def validate(country_code, param):
    return gloabls()["validate_" + country_code](param)
3 голосов
/ 17 июня 2011

Классы не предназначены для группировки функций, модули.Функции в классе должны быть либо методами, которые работают с самим объектом (изменение его состояния, получение информации о состоянии и т. Д.), Либо методами класса, которые делают то же самое, но для самого класса (классы в Python также являются объектами).В Python даже нет необходимости в статических методах, поскольку вы всегда можете иметь функции на уровне модуля.Как говорится: Флэт лучше вложенного .

3 голосов
/ 16 июня 2011

Для этого вам не нужен оператор switch.

validators = {
  'fr': Validator(...),
  'uk': Validator(...),
   ...
}

 ...

validators['uk'](foo)
2 голосов
/ 16 июня 2011

Если вы хотите иметь набор функций, поместите их в отдельный модуль.

...