Цепочка методов - сколько цепных методов достаточно? - PullRequest
2 голосов
/ 28 декабря 2010

Есть ли какие-либо рекомендации относительно того, когда следует прекратить цепочечные методы и вместо этого разбить цепочку на несколько выражений?

Рассмотрим, например, этот код Python, который создает словарь, со словом в качестве ключа и соответствующим счетчиком какзначение:

def build_dict(filename):
    with open(filename, 'r') as f:
        dict = defaultdict(int)

        for word in f.read().lower().split(): # too much?
            dict[word] += 1

        return dict

Хорошо ли использовать 3 метода цепочки?Получу ли я какую-нибудь заметную выгоду, разделив выражение вверх?

Ответы [ 3 ]

6 голосов
/ 28 декабря 2010

Какой смысл объединять только двоих? Если вы делаете цепочку методов, делайте это правильно.

Это больше проблема форматирования, если это слишком много для одной строки, я предпочитаю

(x.Foo()
  .Bar()
  .FooBar()
  .Barf());

Другой проблемой могут быть отладчики, которые заставляют вас отследить до Foo, если вы хотите отследить до Bar.

3 голосов
/ 28 декабря 2010

Одной из причин не использовать длинные цепочки является то, что она скрывает сообщения об ошибках отслеживания.Когда в длинной цепочке возникает исключение, в сообщении об ошибке трассировки указывается только строка, в которой произошло исключение, а не какая часть цепочки.

Если вы уверены, что исключение не произойдет, тогда

for word in f.read().lower().split():
    dict[word] += 1

может быть предпочтительнее, чем

contents=f.read()
contents=contents.lower()
words=contents.split()
for word in words:
    d[word] += 1

, поскольку память используется строкой contents и списком words и не освобождается до тех пор, пока не закончится этот блок кода (при условииникакие другие ссылки на те же объекты не делаются).Поэтому, если памяти недостаточно, вы можете рассмотреть вопрос о цепочках.

Если память не является проблемой, особенно если words или contents можно будет использовать позже в коде, тогда присваивайте переменнуюссылаться на них, конечно, будет быстрее, поскольку методы read, lower и / или split больше не нужно будет вызывать.

3 голосов
/ 28 декабря 2010

Это в основном вопрос личных предпочтений, но если текст в f не будет использоваться в другом месте, то это нормально. Точка, в которой случайному читателю становится неясно, что на самом деле возвращает цепочка, - это точка, в которой она слишком длинная. Единственным преимуществом разделения является то, что вы можете использовать промежуточные результаты и получить ясность.

...