【问题标题】:Is it correct that part of business logic stays in the controller?部分业务逻辑留在控制器中是否正确?
【发布时间】:2011-01-13 20:53:18
【问题描述】:

有一个这样的简化类来规范问答游戏:

class Game():
def __init__(self,username):
    ...
    self.username=username
    self.question_list=db.getQuestions()
    self.game_over=False

def get_question(self):
    ...
    if self.question_list.is_not_empty():
        return question

def check_answer(answer)
    ...
    if answer.is_correct():
        self.game_over=False
    else:
        self.game_over=True

并且拥有一个接收输入参数(如用户名、问题和答案)的 Web 控制器。直接从控制器使用 Game 类是否正确?

我问这个问题是因为看着控制器代码,我也为自己编写了一些逻辑而感到内疚;例如,控制器在收到用户名时实例化 Game,然后按顺序调用 get_question 和 check_answer。

你认为有另一个“层”从控制器接收输入参数并直接与游戏类对话更正确吗?

【问题讨论】:

    标签: model-view-controller oop


    【解决方案1】:

    我觉得你很好。

    问题是,您不可能拥有一个完美的架构,将层和数据格式完全隔离,仅在边界的一侧可见。不可避免的是,某一层必须与另一层对话。

    如果您正在执行非常基本的逻辑来决定控制器下一步如何进行,则可以调用 get_question 和 check_answer。如果只是一些检查会导致一些可能的控制器决策,那就去做吧。

    但是,如果您想从用户那里收集数据,将其转换为某种特定格式,对其进行验证,然后可能会调用可能产生数十种可能结果的业务方法,所有这些都直接在控制器中,它会太清楚了。

    【讨论】:

    • 感谢您的回答;这里的问题是,Game 类将来可以通过许多其他功能进行改进,然后控制器也需要填充更多逻辑;这个设计方面并非微不足道。
    【解决方案2】:

    我肯定会尽可能远离控制器。否则你的控制器膨胀将是荒谬的。

    【讨论】:

    • 不错的视频 :)。那么,您有什么建议?访问 game.py 的另一个层?
    • 我经常使用一个名为 infastructure 的文件夹,我想我是从 Connery 那里学来的,但如果你愿意,也可以将它粘贴到模型中。由您决定要放入多少层。
    猜你喜欢
    • 2017-08-08
    • 2015-05-15
    • 2021-03-28
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    • 2016-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多