我正在学习OO和MVC范例(使用Codeigniter和PHP)。我继续发现这样的警告:如果你发现自己将相同的代码粘贴到多个文件中,那么你就没有正确使用OO / MVC 。所以,对于更有经验的程序员来说,这是一个问题。
我有一个创建用户表单,我使用两个非常相似的版本:
版本1(/volunteer/register
)由匿名用户创建。该表单位于volunteers
控制器中,需要由管理员验证。
版本2(/admin/create_volunteer
)由登录管理员创建。表格和验证几乎相同,但提交的参数不同。
另一个类似的例子:
我想构建共享模板的不同用户仪表板,但将由不同的用户角色使用,并具有基于角色的不同功能和信息。我认为我的选择是:
如果这看起来像二年级,我很抱歉,但实质上我正在寻找确定如何在MVC中设计架构的经验法则。
我的问题:
Volunteer
& Admin
)的逻辑选择是不是很理想?在这种情况下,代码复制是否可以接受?答案 0 :(得分:5)
特别是因为这两种形式不一样(不同的规则,不同的界面),如果你需要它,那么拥有两个独立的视图文件绝对没有错。在两个不同的控制器或方法中加载相同的视图文件是完全可以接受的,实际上它是适当的。如果只需要进行一些调整,请尝试通过向其传递不同的数据来重用视图文件。
如果您只想在不同的实例中加载表单视图文件,那么可以节省一些代码重复。只需设置不同的规则,如果需要,将不同的数据传递给视图。它类似于使用相同的表单以两种不同的方法创建和编辑某些内容。如果输出完全不同,只需编写单独的视图文件。如果它是相同的输出但具有不同的数据 - 肯定重复使用它。
不要痴迷于尝试不复制视图片段代码 - 如果您正在编写更多代码以通过修改视图文件以适应不同的实例来强制重用视图文件,那么它就会失败。尽量使一般操作使代码尽可能重用。
所以,没有看到你的实际代码 - 我会说不要担心它。根据我的经验,前端和后端的视图文件几乎总是唯一的(完全不同的UI)。一般来说,如果你发现你正在复制相同的非常相似的代码,那么就该为它编写函数,类或模板了。
答案 1 :(得分:3)
您似乎希望使用某些ACL来区分角色(志愿者和管理员),以检查是否可以访问所请求的模块或操作。
为角色创建不同的控制器似乎不是一个好选择,因为这个架构无法重用 - 您不希望在其他应用程序中重用特定的Admin或Volunteer功能,而是一个允许您创建和控制这样的角色。
您希望重用提供特定功能的代码,这可能是一个控制器,一个模型和一些视图文件。
答案 2 :(得分:1)
大多数程序员认为重复的代码表明问题的解决方案仍然可以改进。
如果您的问题是在一个控制器中定义了from,但您需要在另一个控制器中使用它,那么您需要一个更好的位置来定义表单,以便两个控制器可以独立于彼此。
使表单可配置,以便可以重复使用它。