【问题标题】:Should I break down codes into as many functions as possible? [closed]我应该将代码分解为尽可能多的功能吗? [关闭]
【发布时间】:2013-03-18 05:36:59
【问题描述】:

假设我有一个以伪代码登录用户的函数

def login():
    # find user in db
    # check if user exists
    # check password
    # login user

每个动作都应该有自己的功能吗?还是应该将所有代码都保留在那里?

编辑:我问这个是因为我通常只是将所有代码放在一个函数中,但我的一个朋友将他需要做的所有事情放在多个函数中,然后在他写下的函数中填写空白

例如。他会这样写:

def login():
    findUser()
    checkUser()
    checkPass()
    userLoggedin()

然后他会创建这些函数并填充它们。

【问题讨论】:

  • 一个普遍的看法是一个函数应该做一件且只有一件的事情。我也听说过一个功能不应该超过屏幕上的一个页面左右,但我不确定我是否真的同意。

标签: performance oop class function design-patterns


【解决方案1】:

我的建议是:

将其分解为有意义的、可重用的函数。当您的代码库增长时,这将是最有用的维护。

# find user in db         => re-usable
# check if user exists    => No. If you find it, it exists. So you don't need that.
                             If you don't find it, it does not. So both should be the same.
# check password          => re-usable
# login user              => re-usable

注意:有一个 WWDC 2012 会议视频,标题为:

基础知识+习惯:让您的软件项目经久不衰

你可以看。目标受众主要是 MAC 开发人员,但他们的许多建议也适用于其他面向对象的语言。您需要一个免费的 MAC 开发者帐户才能访问它。

【讨论】:

  • +1 是的,并将其分组为逻辑关注点以便于重用,但也可以在代码库增长时找到常用方法。
  • 检查密码可能应该是在数据库中查找用户以确保安全并尽量减少数据库往返的一部分。找不到用户的结果,和密码不匹配的结果应该是一样的。步骤为 1. 检查用户名和密码组合是否存在,步骤 2 登录或返回错误。
  • 这确实是相关的。谢谢。我会添加它。
  • @TimothyStrimple 是的。但是如果你只是想知道某个用户是否存在呢?
  • 但是如果你使用的是 LINQ,并且 OP 没有提到任何关于语言的内容,那么让用户会得到一个带有密码等的对象,这样你就不会再遇到数据库了。
【解决方案2】:

我会说是的,从 Visual Studio 的角度来看,它们应该被分成单独的项目。

查找用户 - 数据存储库

检查用户是否存在 - 可能是模型或业务层

检查密码、模型或业务层

登录 - 业务层

这里的目的是将代码分组为逻辑关注点。

【讨论】:

    猜你喜欢
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多