最小惊讶原则(POLA)

最小惊讶原则(pola)

关键概念

1. 一致的方法命名

// bad - inconsistent namingclass usermanager {    public function getuser($id) { /* ... */ }    public function fetchrole($id) { /* ... */ }    public function retrievepermissions($id) { /* ... */ }}// good - consistent naming patternclass usermanager {    public function getuser($id) { /* ... */ }    public function getrole($id) { /* ... */ }    public function getpermissions($id) { /* ... */ }}

命名方法时,一致性至关重要。在这个糟糕的例子中,我们使用三个不同的动词(get、fetch、retrieve)来执行类似的操作。这迫使开发人员记住同一类型操作的不同术语。好的示例在所有方法中一致地使用“get”,使 api 更可预测且更容易记住。当开发人员需要访问数据时,他们会直观地知道寻找以“get”开头的方法。

2. 预期回报类型

// bad - unexpected return typesclass filehandler {    public function readfile($path) {        if (!file_exists($path)) {            return false; // unexpected boolean        }        return file_get_contents($path);    }}// good - consistent return types with exceptionsclass filehandler {    public function readfile($path): string {        if (!file_exists($path)) {            throw new filenotfoundexception("file not found: {$path}");        }        return file_get_contents($path);    }}

这个糟糕的例子混合了返回类型 – 有时返回字符串(文件内容),有时返回布尔值(false)。这给如何处理返回值带来了不确定性。这个很好的例子通过声明字符串返回类型并使用错误情况的异常来确保类型安全。这与 php 的内置行为相匹配,并使错误处理更加明确和可预测。

3. 可预测的参数顺序

// bad - inconsistent parameter orderclass orderprocessor {    public function createorder($items, $userid, $date) { /* ... */ }    public function updateorder($date, $orderid, $items) { /* ... */ }}// good - consistent parameter orderclass orderprocessor {    public function createorder($userid, $items, $date) { /* ... */ }    public function updateorder($orderid, $items, $date) { /* ... */ }}

相似方法中的参数顺序应该保持一致。糟糕的示例将相似的参数放在不同的位置,使 api 变得混乱。好的示例保持了逻辑顺序:首先是标识符(userid/orderid),然后是主要数据(项目),最后是可选/元数据参数(日期)。这种模式符合 php 框架中的常见约定,并使 api 更加直观。

4. 清晰的方法行为

// bad - ambiguous behaviorclass cart {    public function add($product) {        // sometimes creates new item, sometimes updates quantity        // unpredictable!    }}// good - clear, single responsibilityclass cart {    public function addnewitem($product) { /* ... */ }    public function updatequantity($productid, $quantity) { /* ... */ }}

方法应该有明确、单一的职责。坏例子的“add”方法不明确 – 它可能会添加一个新项目或更新一个现有项目。这个很好的例子将其分为两个不同的方法,具有明确的名称和目的。这使得代码的行为可预测,并遵循单一职责原则 (srp)。

5. 一致的错误处理

class PaymentProcessor {    public function processPayment(float $amount): PaymentResult {        try {            // Process payment            return new PaymentResult(true, 'Payment successful');        } catch (PaymentException $e) {            // Always handle errors the same way            throw new PaymentFailedException($e->getMessage());        }    }}

此示例演示了通过异常进行一致的错误处理。当出现问题时,它总是抛出特定的异常类型(paymentfailedexception),而不是返回不同的类型或使用错误代码。这为整个应用程序的错误处理创建了一个可预测的模式。该方法还为成功案例使用专用的 paymentresult 对象,保持类型一致性。

这些实践中的每一种都有助于使代码更易于维护、更易于理解且不易出现错误,因为它的行为方式是开发人员基于 php 开发中的常见模式和约定所期望的方式。

以上就是最小惊讶原则(POLA)的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1251888.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月9日 23:32:04
下一篇 2025年12月9日 07:07:30

相关推荐

  • 关注点分离 (SoC)

    关键实施示例 1. 数据库层分离 // bad – mixed concernsclass user { public function save() { $db = new pdo(‘mysql:host=localhost;dbname=app’, ‘user’, ‘pass’); $stmt …

    2025年12月9日 好文分享
    000
  • Dockerize 您的 PHP 和 MySQL 应用程序:多容器应用程序分步指南

    在现代软件开发领域,容器化已成为高效部署和可扩展性的基石。 docker 可以轻松地将应用程序及其依赖项打包到可移植容器中。在本博客中,我们将引导您使用 docker compose 创建多容器 php 和 mysql 应用程序。 为什么对 php 和 mysql 使用 docker? 一致性:在开…

    2025年12月9日
    000
  • Dockerize CodeIgniter 分步指南

    在这篇博文中,我们将介绍如何对 codeigniter 3 应用程序进行 docker 化。在本指南结束时,您将拥有一个使用 apache、php 和 mysql 运行的容器化应用程序,所有这些都通过 docker compose 进行管理。这种方法将简化您的开发环境并确保跨多个系统的设置一致。 先…

    2025年12月9日
    000
  • PHP MongoDB 连接

    Php提供了mongodb驱动程序来连接mongoDB数据库。安装完成后,我们就可以使用php.ini来进行数据库操作了。这里,我们使用 Ubuntu 16.04 创建一个示例。该示例包括以下步骤。 1) 安装驱动程序 $ pecl 安装 mongodb   2) 编辑php.ini 文件 它存储在…

    2025年12月9日 好文分享
    000
  • Docker 化一个简单的 PHP 应用程序

    对于寻求跨不同环境的一致性和可移植性的开发人员来说,容器化是游戏规则的改变者。在这篇博文中,我们将介绍一个对简单 php 应用程序进行 docker 化的实际示例。在本指南结束时,您将拥有一个可运行的 docker 容器,为基本的 php 应用程序提供服务。 概述 我们将使用 docker 容器化一…

    2025年12月9日
    000
  • 快速失败

    核心原则 故障发生后立即检测并报告,防止无效状态在系统中传播。 1. 输入验证 class userregistration { public function register(array $data): void { // validate all inputs immediately $thi…

    2025年12月9日
    000
  • PHP和SQL数据库:如何实现基于分类的JSON分组输出?

    php sql 如何基于组查询的结果进行 json 分类输出 在本文中,我们将解决如何根据分类对数据库查询结果进行分组并将其输出为 json 的问题。以下是对问题的简要描述: 给定两个数据库表: 分类表 class详情表 detail 目标是根据分类对 detail 表中的记录进行分组,并输出为 j…

    2025年12月9日
    000
  • SQL分组数据如何生成JSON格式输出?

    分组分类查询输出 json 问题: 如何根据 sql 中分组后的数据生成 json 输出?本文将以一个实际示例展示如何实现这一操作。 假设数据库结构: 分类表(class): cid(主键)cname(分类名称) 详情表(detail): did(主键)cid(分类 id)simplew(简单单词)…

    2025年12月9日
    000
  • UniApp每日签到功能如何结合PHP后端实现?

    如何用uniapp实现每日签到功能 使用uniapp 结合 php 后端,我们可以实现每日签到功能。该功能可用于奖励用户每日访问您的应用或网站。 后端实现 php 后端负责处理签到的逻辑。对于每个用户,保存一个日期记录,用于跟踪其上次签到时间。当用户签到时,后端会检查此日期记录,如果该日期是当天,则…

    2025年12月9日
    000
  • PHP中如何高效地删除数组中的指定键?

    删除数组中的键 如何在 php 中删除数组中的键? 要从数组中删除一个键,可以使用 unset() 函数。该函数需要键名作为参数。然而,由于您希望保留数组的原始结构,您需要使用该键的引用(&)。 代码示例 立即学习“PHP免费学习笔记(深入)”; $data = [ [ “id” =>…

    2025年12月9日
    000
  • Uniapp每日签到功能如何实现?

    如何在 uniapp 中实现每日签到功能 每日签到功能在应用中很常见,它可以提高用户参与度并建立忠诚度。在 uniapp 中实现此功能涉及到前端和后端的配合。 后端实现:签到记录及积分奖励 后端使用 php,需要实现以下功能: 签到记录:每当用户签到时,为其生成一条记录,其中包含用户 openid、…

    2025年12月9日
    000
  • 如何使用PHP和SQL实现分组查询并以JSON格式输出结果?

    使用 php sql 对数据进行分组查询,并以 json 格式输出结果 问题 如何利用 php sql 对数据库中的数据进行分组查询,并将其输出为 json 格式? 解决方案 立即学习“PHP免费学习笔记(深入)”; 1. 首先,使用 mysqli_query() 方法查询数据库 $querycla…

    2025年12月9日
    000
  • 如何用PHP将SQL分组查询结果(分类表和详情表)输出为JSON格式?

    使用 php 将 sql 分组查询结果分类输出为 json 针对数据库结构中包含分类表和详情表的场景,您希望将查询结果按照分类进行分组,并输出为 json 格式。接下来,我们将提供一种改进的解决方案。 解决方案: 0, ‘msg’ => ‘Ok’, ‘data’ => null];// …

    2025年12月9日
    000
  • Docker -v挂载失败导致容器无法启动怎么办?

    docker -v 挂载无法启动容器的排查 当在 docker 容器中使用 -v 参数挂载主机目录时,有时会出现无法启动容器的情况。本文将分析其原因并提供解决方案。 问题:-v 挂载后容器无法启动 错误症状通常表现为容器启动后立即退出,输出如下消息: docker: error response f…

    2025年12月9日
    000
  • PHP和SQL分组查询结果如何以JSON格式输出?

    php sql 如何按照分组查询后分类输出为 json? 问题: 需要将数据库中的数据分组输出为 json 格式,但当前代码只实现了按照分类遍历输出的情况。如何改进代码来输出为 json? 改进方案: 立即学习“PHP免费学习笔记(深入)”; 初始化一个名为 $response 的数组,用以存放响应…

    2025年12月9日
    000
  • Gin框架中ctx.Stream失效:为什么启用压缩中间件后流式传输无效?

    gin 的 stream 输出机制 问题:为什么 gin 的 ctx.stream 无法直接将输出流式传输到客户端? 解答: ctx.stream 输出不生效的原因是启用了 gin 的压缩输出中间件。 r := gin.new()r.use(brotli.brotli(brotli.defaultc…

    2025年12月9日
    000
  • PHP数组中如何彻底删除键值对?

    如何从 php 数组中删除键 希望删除数组中的某个键值对,通常有以下解决方案: $data = [‘id’ => 5, ’email’ => ‘foo@example.com’, ‘password’ => ‘secret’];unset($data[‘password’]); 但…

    2025年12月9日
    000
  • php注册页面代码怎么写

    在编写 PHP 注册页面代码前,需准备 PHP 环境并建立用于存储用户注册信息的数据库。编写代码包括创建 HTML 表单让用户输入注册信息,并在 PHP 中处理提交的信息,包括检查用户名和邮箱是否已存在,若否则完成注册。 php注册页面代码编写指南 一、准备工作 在编写php注册页面代码之前,需要在…

    2025年12月9日
    000
  • Composer安装fxp/composer-asset-plugin失败如何解决?

    composer 安装 fxp/composer-asset-plugin 失败,检查 composer-plugin-api 版本 在尝试通过 composer 安装 fxp/composer-asset-plugin:~1.3.0 时,出现了如下错误: fxp/composer-asset-pl…

    2025年12月9日
    000
  • Composer安装fxp/composer-asset-plugin报错:如何解决版本冲突?

    composer 安装 fxp/composer-asset-plugin ~1.3.0 报错 安装 fxp/composer-asset-plugin ~1.3.0 时,遇到如下错误: fxp/composer-asset-plugin[v1.3.0, …, v1.3.1] require c…

    2025年12月9日
    000

发表回复

登录后才能评论
关注微信