如何重构这个Python代码?

时间:2009-07-23 23:26:11

标签: python google-app-engine refactoring

class MainPage(webapp.RequestHandler):
  def get(self):
    user = users.get_current_user()
    tasks_query = Task.all()
    tasks = tasks_query.fetch(1000)
    if user:
      url = users.create_logout_url(self.request.uri)
    else:
      url = users.create_login_url(self.request.uri)
    template_values = {
      'tasks': tasks,
      'url': url
      }
    path = os.path.join(os.path.dirname(__file__), 'index.html')
    self.response.out.write(template.render(path, template_values))

class Gadget(webapp.RequestHandler):
  def get(self):
    user = users.get_current_user()
    tasks_query = Task.all()
    tasks = tasks_query.fetch(1000)
    if user:
      url = users.create_logout_url(self.request.uri)
    else:
      url = users.create_login_url(self.request.uri)
    template_values = {
      'tasks': tasks,
      'url': url
      }
    path = os.path.join(os.path.dirname(__file__), 'gadget.xml')
    self.response.out.write(template.render(path, template_values))

4 个答案:

答案 0 :(得分:6)

实际上,这取决于您希望将来两个类之间的共同点。重构的目的是识别常见的抽象,而不是最小化代码行数。

也就是说,假设两个请求预计仅在模板中有所不同:

class TaskListPage(webapp.RequestHandler):
    def get(self):
        user = users.get_current_user()
        tasks_query = Task.all()
        tasks = tasks_query.fetch(1000)
        if user:
          url = users.create_logout_url(self.request.uri)
        else:
          url = users.create_login_url(self.request.uri)
        template_values = {
          'tasks': tasks,
          'url': url
          }
        path = os.path.join(os.path.dirname(__file__), self.template_name())
        self.response.out.write(template.render(path, template_values))

class MainPage(TaskListPage):
    def template_name(self):
        return 'index.html'

class Gadget(TaskListPage):
    def template_name(self):
        return 'gadget.xml'

答案 1 :(得分:1)

为什么目的重构?您是否收到错误,想要做其他事情,或者......?假设有适当的导入和url调度,我在这里看不到任何必须为app引擎重构的东西 - 所以,不要让我们猜测! - )

答案 2 :(得分:1)

由于除了一个字符串('index.html'vs'adjget.xml')之外,两个类都是相同的,是否可以将一个字符串作为另一个字符串的子类,并将两个字符串作为类常量?< / p>

答案 3 :(得分:1)

使它成为同一个类,并使用GET或POST参数来决定要呈现的模板。