草庐IT

php - 一种非OO的PHP设计模式,最适合这种情况的PHP模式

coder 2024-05-04 原文

我们得到了一个 php 库存程序。然后我们应该说设计模式是否会使程序更好,或者它是否只会使程序更复杂。

程序结构如下。

该程序被分解为嵌入了 html 的 php 脚本。要么 (A) 一个完整的 php 页面专门用于一个选项,要么 (B) 一个选项的逻辑在另一个脚本页面内,该页面用于类似操作的其他选项。 (这不包括简单的按钮,例如“重置”和“返回主页”。)

(A) 例如,一旦您打开网站,就会出现一个带有选项的导航菜单。当您单击一个选项时,例如在客户下,有一个“查看”链接。单击后,您将被带到另一个页面,其中包含与更多选项相对应的其他链接,例如“编辑”和“删除”。通常,对于这个网站,每个选项都对应于它自己的 php 脚本页面。例如,“View”对应于 list_customers.php。 “编辑”对应于edit_customer.php。

(B) 可能发生的另一件事是该选项的逻辑位于“通用”脚本页面中。我的意思是,几个选项的逻辑被组合到一页中。这方面的一个例子是“删除”。在可以删除客户、工作订单或报价之前,将定向到一个名为 auth.php 的 php 脚本页面,以确保只有管理员可以删除。检查是否是管理员登录以及删除客户、工作订单或报价单的逻辑也在 auth.php 中。另一个例子是客户的所有“搜索”选项。虽然它有自己的页面 search_customer.php,但实际搜索的逻辑实际上在 list_customers.php 中。所有搜索都遵循此模式,包括搜索客户、报价或交付报告;搜索代码实际上在对应的list_*.php页面中。

我发现很难找到不会使它变得更复杂的设计模式。我发现的大多数都是面向 OO 范例的,而这个 list 肯定不是。工厂模式当然无济于事,因为我找到它的唯一有用方法是登录(用户名和密码)是否更改为(用户名、密码、ID 号)之类的内容。但是,我认为这不会有用,因为只有 2 个 php 页面具有登录功能。

我还研究了是否可以将所有搜索逻辑都放在一个对象中。但是,每种类型的搜索都必须有自己的方法(因为它们正在查询差异表),并且与当前设置没有太大区别(每个搜索当前都在相应的列表 php 页面中。)

我发现唯一可能有用的是正则表达式的设计模式。程序中的表单未经验证。你有什么想法吗?

此外,类(class)的主题是软件质量。我个人的看法是,设计模式会使这个网站变得更复杂,因为它不是一个大项目。但是我的同学们争辩说,因为它不是面向对象的,所以它不那么可维护。但我在想,PHP 不是面向对象的,我说得对吗?因此,强制它符合 OO 设计模式只会把事情搞砸。

你怎么看?任何可能适用于这种情况的设计模式?

最佳答案

We are then supposed to say if a design pattern will make the program better or if it will just make the program more complicated.

设计模式是常见问题的常见解决方案。您不使用设计模式来使用设计模式。您使用它们来解决特定问题。最突出的设计模式来自 GOFPOEAA .其中一些很容易实现,比如策略,而另一些则需要更多的架构思想。

一些您甚至不知道使用的设计模式,例如,您的操作脚本听起来像 TransactionScript大部头书。是的,你可以把它们变成一个 PageController减少脚本中的样板代码。你可以添加 FrontController然后减少 PageControllers 中的样板文件。当您这样做时,为什么不使用 MVC 将业务逻辑和 UI 分开?

一般来说,从长远来看,设计模式将使您的代码更易于维护,特别是如果您保留您的实现 GRASP , SOLIDDRY .设计模式还将使您的代码更易于理解和讨论,因为模式是定义明确的术语。告诉开发人员这段代码是 Factory,他/她会理解你的意思。

但是,是的,设计模式也可能使您的代码更加复杂,您应该知道在哪里停止以防止过度工程。也不是说不要用,而是在能解决特定问题的地方合理使用。还可以考虑了解常见的 AntiPatterns .

由于类(class)是关于软件质量的,您应该知道软件质量不是通过代码中设计模式的数量来衡量的。软件质量是通过许多指标来衡量的,并且有用于衡量它们的工具。看看Quality Assurance in PHP Projects得到一个想法。

旁注,设计模式不一定必须与 OOP 一起使用。 OOP 只是一种组织代码的好方法,许多设计模式确实针对但不限于 OOP。 MVC 可以与过程代码一起使用。您可以将 Strategy 和 Factory 与匿名函数一起使用,FrontController 可以是一个简单的 switch/case 语句,等等。这是因为设计模式是架构蓝图,并且主要与语言和范例无关。

关于php - 一种非OO的PHP设计模式,最适合这种情况的PHP模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4182067/

有关php - 一种非OO的PHP设计模式,最适合这种情况的PHP模式的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - 默认情况下使选项为 false - 2

    这是在Ruby中设置默认值的常用方法:classQuietByDefaultdefinitialize(opts={})@verbose=opts[:verbose]endend这是一个容易落入的陷阱:classVerboseNoMatterWhatdefinitialize(opts={})@verbose=opts[:verbose]||trueendend正确的做法是:classVerboseByDefaultdefinitialize(opts={})@verbose=opts.include?(:verbose)?opts[:verbose]:trueendend编写Verb

  4. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  5. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  6. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  7. ruby - 是否有用于序列化和反序列化各种格式的对象层次结构的模式? - 2

    给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最

  8. ruby - 在不使用 RVM 的情况下在 Mac 上卸载和升级 Ruby - 2

    我最近决定从我的系统中卸载RVM。在thispage提出的一些论点说服我:实际上,我的决定是,我根本不想担心Ruby的多个版本。我只想使用1.9.2-p290版本而不用担心其他任何事情。但是,当我在我的Mac上运行ruby--version时,它告诉我我的版本是1.8.7。我四处寻找如何简单地从我的Mac上卸载这个Ruby,但奇怪的是我没有找到任何东西。似乎唯一想卸载Ruby的人运行linux,而使用Mac的每个人都推荐RVM。如何从我的Mac上卸载Ruby1.8.7?我想升级到1.9.2-p290版本,并且我希望我的系统上只有一个版本。 最佳答案

  9. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  10. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

随机推荐