2016-05-22 4 views
0

У меня есть небольшой фрагмент кода, и я думаю о рефакторинге. Я на самом деле не нравится в части sort_paths_by_date метода DRY: Из-принципа и кода ясности:Рефакторинг фрагментов Python

from os.path import getctime, getmtime 

class Endpoint(object): 
    def __init__(self, define_path_by, paths): 
     self.define_path_by = define_path_by 
     self.paths = paths 

    def sort_paths_by_date(self): 
     if self.define_path_by == 'ctime': 
      self.paths = sorted(
       self.paths, 
       key=lambda cur_path: getctime(cur_path.path), 
      ) 
     elif self.define_path_by == 'mtime': 
      self.paths = sorted(
       self.paths, 
       key=lambda cur_path: getmtime(cur_path.path), 
      ) 

и я сделать это следующим образом:

from os.path import getctime, getmtime 

class Endpoint(object): 
    def __init__(self, define_path_by, paths): 
     self.define_path_by = define_path_by 
     self.paths = paths 

    def sort_paths_by_date(self): 
     def sort_with_func(func): 
      return sorted(
       self.paths, 
       key=lambda cur_path: func(cur_path.path) 
      ) 

     if self.define_date_by == 'ctime': 
      self.paths = sort_with_func(getctime) 
     elif self.define_date_by == 'mtime': 
      self.paths = sort_with_func(getmtime) 

Но теперь я не уверен, что функции определение в методе, и снова ясность кода смущает меня. Поэтому я буду благодарен за ваш опыт рефакторинга.

ответ

2

Ваша функция кажется немного излишне сложной. Это может быть просто так:

def sort_paths_by_date(self): 
    if self.define_path_by in ('ctime', 'mtime'): 
     fn = getctime if self.define_path='ctime' else getmtime 
     self.paths = sorted(self.paths, key=lambda cur_path: fn(cur_path.path))