DX:Setter,Wither和突变体
#编程 #php #体系结构 #dx

(英语版本:https://dev.to/fredbouchery/dx-setter-wither-and-mutants-29e6

当我受孕时,我会花费大量时间来为其DX(开发人员体验),这就是为什么我批准“测试前”,因为它使我可以在暗示之前使用代码的另一种方法。

duely,我构思了一个用于访问BDD的配置类,这是我最初想象的脸部使用:

<?php
$conf = (new ConnectionConfig())
    ->connection('main')
        ->driver(DriverInterface::DRIVER_MYSQL)
        ->primary()
            ->host('127.0.0.1', 3306)
            ->credentials('root', 'root')
        ->replica()
            ->host('127.0.0.1', 3307)
            ->credentials('readonly', 'readonly')
;

在暗示级别上,它是一个相关界面(fluent interface)非常简单:

  • connection(string $name)完成了专有的“ $currentConnectionName
  • primary()replica()即将完成礼节

然后,当我们致电host()credentials()时,我使用专有人“ $currentXxxx”来存储信息。

然后,我想结束我要如何阅读此信息,然后开始被告知:

<?php
[
    'login' => $login,
    'password' => $password
] = $conf
    ->connection('main')
    ->primary()
    ->getCredentials()
;

第一个观察:pffff ...我懒了完成一个“服务器限制性”对象来存储登录和通行证,而关联表则可以解决问题。不要用这个姐姐的表情看着我,我们都做到了……在懒惰的日子里,正如阿比亚克(Abiaoqian)所说的那样:“有几天,不买我!每天都有日子!”。但这不是今天的检测,让我看看我想突出的以下问题。

要阅读身份,我使用了一个getCredentials() getter,而我使用了简单的thode credentials($login, $pass),因为我为我的dx找到了更多 cool < /em>。< /p>

简而另外,当IDE是自我控制并提出这两个伴侣时,它可能会令人困惑。

嗯,当然,没有太多的歧义,因为一个具有两个参数$login$pass的thode,它很可能会帮助他们。但是,当我被送去用播放器更改时。

是的,因为当您拥有良好的DX时,您必须过多地生活以改变冰球手和冰球手的习惯!即使您的想法似乎是革命性的,创新的,从未做过,这也可以极大地为您的DX服务。

所以见你更改结局:

<?php
$conf = (new ConnectionConfig())
    ->connection('main')
        ->setDriver(DriverInterface::DRIVER_MYSQL)
        ->primary()
            ->setHost('127.0.0.1', 3306)
            ->setCredentials('root', 'root')
        ->replica()
            ->setHost('127.0.0.1', 3307)
            ->setCredentials('readonly', 'readonly')
;

,已经给我带来了一个新的困难:突变体!

查看此代码:

<?php
$serverIp = '127.0.0.1';
$login = 'root';
$password = 'root';

$conf = new ConnectionConfig();

$primary = $conf->connection('main')->primary();
$replica = $conf->connection('main')->replica();

// Define hosts
$primary->setHost($serverIp, 3306);
$replica->setHost($serverIp, 3307);

// Define credentials
$primary->setCredentials($login, $password);
$replica->setCredentials($login, $password);

是的,我们想象一种使用代码的方法,而这个人将以另一种方式做到这一点,这是他的权利。

仅在当前情况下,有一个相当丢失的错误:主服务器从未完成。如果您不明白为什么,我让您在阅读将关注的解释之前尝试理解。









正如我指出的目的,当我们调用primary()replica()时,我们开始完成$currentReplicationServer的礼节,并且当我使用“流利”界面时,变量$primary$replica包含所有两个相同对象实例。因此,在致->replica()的呼叫期间,将修改专有$currentReplicationServer以表明我们配置了recordica,这也与变量$primary中的实例有关(如果您未正确理解,我让您重读)。

)。

)。

我们属于PHP(和其他语言)的伟大经典:物体的utiberiblesible。

为了依靠这一点,我们使用自我克服,改变了礼节,然后返回新实例。所以我们从:

<?php
public function primary(): self
{
    $this->currentReplicationConfiguration = 'primary';

    return $this;
}

â:

<?php
public function primary(): self
{
    $self = clone $this;

    $self->currentReplicationConfiguration = 'primary';

    return $self;
}

,我们将把这项技术应用于所有MESE,除了...它不起作用。因为在这种情况下:

<?php
$conf = new ConnectionConfig();

$primary = $conf->connection('main')->primary();
$replica = $conf->connection('main')->replica();

我想要的是,$ conf包含所有配置,对于“手”连接,带有主服务器和re -plica,最后,我们有3个具有分离值的实例配置类。

这就是设计“ 流利”的全部问题!

有可能部分脱落的可能性,是通过让人们对velopper或velopper的理解,thode返回了一个新实例:我们将用“ withers”替换“固定器”:

<?php
$conf = new ConnectionConfig();
$primary = $conf->withConnection('main')->withPrimary();

使用固定的pre -“ with”表示返回将是对象的新实例,因此$conf$primary不是同一实例。因此

在Allité中,我们没有通过补充代码来解决这个问题,而只是通过简单的声望,因为是的,是代码的设计和良好的DX,也经过了他的命名。

最终代码将是:

<?php
$conf = (new ConnectionConfig())
    ->withConnection('main')
        ->setDriver(DriverInterface::DRIVER_MYSQL)
        ->withPrimary()
            ->setHost('127.0.0.1', 3306)
            ->setCredentials('root', 'root')
        ->withReplica()
            ->setHost('127.0.0.1', 3307)
            ->setCredentials('readonly', 'readonly')
;

,如果我们回到访问权限,它给出了:

<?php
[
    'login' => $login,
    'password' => $password
] = $conf
    ->withConnection('main')
    ->withPrimary()
    ->getCredentials()
;

坦率地说,我并没有像DX一样疯狂,因为在我的小脑中,我倾向于将“枯萎”与构造相关联,而不是访问。

这是圆的正交,您找不到?

实际上不,这仅仅是因为我的目的以来我一直在错误的轨道上,而这开始了我很懒惰的批评!

  1. 我的班级将被称为“ ConnectionsConfiguration”,带有“ s”和一个完整的单词(停止快捷方式,不是另外7个特征会影响您的生产力)
  2. 只有一个“ connection(string $name)”返回对象“ ConnectionConfiguration”(因此没有“ s”)
  3. ConnectionConfiguration具有三个setDriver()primary()replica() Menes,其中最后两个返回可变 ServerConfiguration
  4. ServerConfiguration包含四个Medods setHost()setCredentials()getHost()getCredentials()获得ServerHostServerCredentials对象

最后,代码将是:

<?php
$conf = (new ConnectionsConfiguration())
    ->connection('main')
        ->setDriver(DriverInterface::DRIVER_MYSQL)
        ->primary()
            ->setHost('127.0.0.1', 3306)
            ->setCredentials('root', 'root')
        ->replica()
            ->setHost('127.0.0.1', 3307)
            ->setCredentials('readonly', 'readonly')
;

对于setHostsetCredentials MESE,我们允许自己设置一个过载以接受Serverhost和ServerCredentials的实例第一个参数。不要忘记命名您的参数$hostnameOrServerHost$loginOrServerCredentials

阅读,它给出:

<?php
$credentials = $conf
   ->connection('main')
   ->primary()->
   ->getCredentials()
;
$login = $credentials->login;
$password = $credentials->password;

最细心的人会注意到我的班级是可变的,对于某些人来说,这是一个丑闻,丑闻,可耻的,应该把我带到BDE!对于那些,我读了remad:
是的,但这将比它到达的问题要多得多,并且会打破我的DX。因此,我将您送回Krén的口头禅:“有几天,不要买自己!每天都有几天!”。

和râ©râ©:

  • 将自己从使用的角度放置,而不是含义
  • 不要过多创新,人们有习惯
  • 永远不要懒惰
  • 使用简短的不变性
  • 请注意状态对象上的流利接口
  • 阅读Kréün,这是一本漫画书