net_bazzline/component_requirement

自由开源的 PHP 组件需求

1.2.0 2016-03-06 20:37 UTC

This package is auto-updated.

Last update: 2024-09-07 18:34:06 UTC


README

我仍然喜欢这个想法,但目前还没有开发它的用例。

开发原因

自由开源的 PHP 组件。

作为一名 PHP 开发者,我每天都要处理大量的重构任务。重构不仅包括代码重构,还包括业务逻辑重构。目前团队成员已经发现了一个通用问题,我们都知道我们必须将“混乱纳入笼子”的原因如下

  • 开发者很懒,想调用简单的方法而不是重写复杂的表达式
  • 在我们发现代码中的奇怪部分后,我们想将其放入句子中以发现业务逻辑
  • 我们希望有一个通用的组件,可以重复使用业务项
  • 由于业务逻辑可能会嵌套,组件应该能够处理这种情况
  • 添加简单的方法来防止需求未来变化(在 1.0.1 中锁定)
  • 添加简单的方法来禁用需求评估(在 1.1.0 中通过 IsDisabledInterface 实现)
  • 需求应该是无状态的,以便尽可能频繁地重用

当前 master 分支的构建状态由 Travis CI 跟踪:构建状态

审查器状态如下: 代码质量 | 构建状态

版本眼状态如下: 依赖关系

下载量: 本月下载

未述说的发展故事

在(请看下边的致谢部分)我们确定需求之后,花了一些时间来考虑如何将这些需求转化为类。时间过去了,我和团队成员进行了一次深入的交流,他向我展示了他的想法。我非常喜欢这个想法,但也发现了一些缺点。这并不是团队成员的过错(而且我也不比他更擅长编程),但这是组件最初创建的方式。在我回家的路上,我有一些想法,如何使事情简单且通用,并开始了这个项目。第二天,jens 加入了我,我们很快取得了一些进展,并很快发布了 版本 1.0.0

注意

  • 我自豪地链接到一个 规范,这是关于这个组件的“为什么”的书面解释。

常用术语和名称

为了理解这个组件,了解所使用的术语和名称是很有价值的。我们最终决定使用以下术语。

  • 需求:这是你想与之工作的类。你可以通过工厂扩展它或直接使用它。这个类表示业务逻辑,包含所有“和”和“或”。
  • 条件:在阅读和编写业务逻辑之后,每个条件都充满了“或”和“与”。因此,我们提供了两个条件,用于处理业务项集合(简单的规则)。
  • IsMetInterface:为了简化,当你实现业务逻辑或对其进行验证时,你只想知道“这个需求是否满足”,这就是这个接口的目的。这个接口在需求以及条件中都有实现,你需要在你的项目中实现它。
  • “()”用于表示“与”条件:(“foo”,“bar”)表示“foo 和 bar”。
  • “[]”用于表示“或”条件:[“foo”,“bar”] 表示“foo 或 bar”。

示例

一般

组件中包含了一些 示例

你可以随意拉取更多。不过,要使用这个组件,你必须进行以下步骤(是的,这已经是示例了)。

  • 尝试通过写一句话来总结:如果用户对 OOP 或大数据感兴趣,并且如果他热爱开源软件,没有问题阅读 man 页面或使用他喜欢的搜索引擎,或者如果他已经是现有开源项目的维护者或贡献者,那么他满足我们的需求。
  • 提取相关的项:“OOP”,“大数据”,“热爱开源”,“阅读 man 页面”,“使用喜欢的搜索引擎”,“维护者”,“贡献者”。
  • 为每个项创建一个实现 IsMetInterface 并提供不等设置方法的类。
  • 将项收集到条件中:[([“OOP”,“大数据”],“热爱开源”["阅读 man 页面","使用喜欢的搜索引擎"]),[“维护者”,“贡献者”]]。
  • 创建项并将它们注入到正确的条件中,注意你甚至可以将条件注入到条件中(这意味着将一个条件与另一个条件结合)。
  • 将此实现为一个扩展需求类的类,或者通过工厂进行组装。

简单示例

简单示例处理一周的工作日问题。它定义了一个工作日项。你可以使用这个项来检查是否满足正确的工作日需求。

正如您在工作日示例实现中所见。该示例使用或条件将两个有效的工作日("Mon"和"Tue")连接起来。用一句话来说,可以是“当当前工作日是周一或周二时,要求得到满足”。

//to start the example
php examples/Simple/Example.php

表格示例

表格示例处理嵌套条件。

将要求用一句话表达,“当表格的颜色是绿色或红色或棕色或黄色,且表格具有可扩展或可折叠的功能,或者表格的高度为80厘米,或者由jens wiese或stev leibelt开发时,要求得到满足。此示例需要多个项目,包括颜色项目、功能项目、高度项目和开发者项目。这些项目通过多个条件连接,条件嵌套在一起。如果我们使用上述常用术语来表达这个要求,我们可以这样写。[([green,red,brown,yellow],[extendable,foldable],[80cm]),[jens wiese,stev leibelt]]。熟悉这种表达方式需要一些时间,但它可以澄清一些问题。

此示例展示了如何良好地使用"__invoke()"方法。

//to start the example
php examples/Table/Example.php

验证器示例

验证器示例使用该组件作为验证器。

该示例展示了如何通过定义简单的验证器,将它们添加到集合中,并使用要求类作为验证器来使用组件。只有当所有验证器都返回正面的"isMet"时,表格才通过了验证。目前,没有堆栈跟踪可用(请检查即将发布的版本),因此目前的唯一反馈是,表格无效。

//to start the example
php examples/Validator/Example.php

禁用要求示例

禁用要求示例使用禁用整个要求的能力。

此示例展示了如何使用IsDisabledInterface的实现。首先,使用总是返回false的项目来评估要求。如果对要求调用disable,则行为会改变,评估现在总是返回true。

//to start the example
php examples/WithDisabledRequirement/Example.php

禁用条件示例

禁用条件示例使用禁用条件的能力。

此示例展示了如何使用IsDisabledInterface的实现。首先,使用总是返回false的项目来评估要求。如果对条件调用disable,则行为会改变,评估现在总是返回true。

//to start the example
php examples/WithDisabledCondition/Example.php

禁用项目示例

禁用项目示例使用禁用项目的能力。

此示例展示了如何使用IsDisabledInterface的实现。首先,使用总是返回false的项目来评估要求。如果对项目调用disable,则行为会改变,评估现在总是返回true。

//to start the example
php examples/WithDisabledCondition/Example.php

使用和开发的提示

总的来说,您需要为您的项目实现一个setter方法。您可以在要求中创建setter方法,或简单地使用注解。要求类和条件类使用魔法__call方法将调用从要求通过条件传递到项目。

如果您想创建一个可以自己组装的要求类或使用工厂,这是一个您必须做出的决定。

下载和安装

GitHub

git clone https://github.com/bazzline/php_component_requirement

Packagist.org

require: "net_bazzline/component_requirement": "dev-master"

感谢

感谢Mihai Andrei Cosma - 这是您的想法,由我们自己开发 :-).

版本历史

  • 即将发布
    • @todo
      • 研究是否可以使用gherkin创建需求
      • 添加堆栈跟踪以检索返回false的第一个isMet-Item
      • 添加触发器以遍历所有isMet-Item并添加所有失败的堆栈跟踪
      • 添加文档
      • 在openhub中创建项目
      • 删除"{@inheritdoc}"和"@author"
  • 1.2.0 - 发布于2016年3月6日
    • 迁移到psr-4自动加载
  • 1.1.7 - 发布于2015年12月11日
    • 更新依赖项
  • 1.1.6 - 发布于2015年11月8日
    • 更新依赖项
  • 1.1.5 - 发布于2015年9月13日
    • 更新依赖项
  • 1.1.4 - 发布于2015年8月19日
    • 更新依赖项
  • 1.1.3 - 发布于2015年7月29日
    • 更新依赖项
  • 1.1.2 - 发布于2015年7月4日
    • 更新依赖项
  • 1.1.1 - 发布于2015年5月27日
    • 实现"__invoke()"以将需求作为函数使用
    • 表格示例调整为使用"__invoke()"
  • 1.1.0 - 发布于2015年3月18日
    • 添加了WithDisabledCondition示例
    • 添加了WithDisabledItem示例
    • 向RequirementInterface添加了getConditions()方法 - 这简化了单个条件或单个项的禁用(通过使用condition->getItems())
    • 添加了迁移指南
    • 添加了版本eye和scrutinizer覆盖率
    • 使用单元测试覆盖了AbstractItem和AbstractCondition
    • 创建了实现ItemInterface的AbstractItem
    • 创建了IsDisabledInterface
    • 创建了ItemInterface
    • 创建了所有phpunit测试都扩展的TestCase
    • 在AbstractCondition中实现了IsDisabledInterface
    • 在Requirement中实现了IsDisabledInterface
    • 重构了ConditionInterface,addItem现在只接受ItemInterface而不是IsMetInterface
    • 重构了Condition::getItems() - 现在返回纯PHP数组
    • 将ConditionAbstract重命名为AbstractCondition
    • 重命名并更新了先前的WithShutdown示例为WithDisabledRequirement
    • 更新依赖项
  • 1.0.5 - 发布于2013年9月16日
    • 添加了通过使用shutdown通过isMet方法调用启用或禁用需求评估的机制
  • 1.0.4 - 发布于2013年8月12日
    • 添加了将组件用作验证器的示例
  • 1.0.3 - 发布于2013年7月22日
    • 在抽象方法中添加了魔法__call条件缓存,以避免对每个项进行迭代(如果添加新项则无效缓存)
  • 1.0.2 - 发布于2013年7月8日
  • 1.0.1 - 发布于2013年6月29日
    • 在示例需求中添加了注释
    • 在需求(requirement)和条件(condition)的魔术 __call 方法中添加了返回值 $this
    • 在 ConditionInterface 的 addItem 方法中添加了返回值 $this
    • 在 RequirementInterface 的 addCondition 方法中添加了返回值 $this
    • 为 RequirementInterface 添加了锁(lock)和 isLocked 方法,如果调用 addCollection 方法时需求被锁定,将抛出 RuntimeException
    • 更新了 readme 文件,其中包含了提供的示例说明
  • 1.0.0 - 发布于 2013年6月27日
    • 完成了 RequirementInterface 的建模(移除了 addItem 方法)
    • 完成了两个示例
    • 完成了单元测试(unittests)
  • 0.9.0 - 发布于 2013年6月27日
    • 完成了 IsMetInterface 和 ConditionInterface 的建模

结语

如果你喜欢它,请给它点个星吧 :-). 如果需要,请添加问题。如果你喜欢,请拉取补丁。如果你使用它,请写一篇博客。如果你爱它,请捐赠一些东西 :-]。