(英语版本: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)所说的那样:“有几天,不买我!每天都有日子!”。但这不是今天的检测,让我看看我想突出的以下问题。
要阅读身份,我使用了一个 简而另外,当IDE是自我控制并提出这两个伴侣时,它可能会令人困惑。 嗯,当然,没有太多的歧义,因为一个具有两个参数 是的,因为当您拥有良好的DX时,您必须过多地生活以改变冰球手和冰球手的习惯!即使您的想法似乎是革命性的,创新的,从未做过,这也可以极大地为您的DX服务。 所以见你更改结局: ,已经给我带来了一个新的困难:突变体! 查看此代码: 是的,我们想象一种使用代码的方法,而这个人将以另一种方式做到这一点,这是他的权利。 仅在当前情况下,有一个相当丢失的错误:主服务器从未完成。如果您不明白为什么,我让您在阅读将关注的解释之前尝试理解。getCredentials()
getter,而我使用了简单的thode credentials($login, $pass)
,因为我为我的dx找到了更多 cool < /em>。< /p>
$login
和$pass
的thode,它很可能会帮助他们。但是,当我被送去用播放器更改时。
<?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一样疯狂,因为在我的小脑中,我倾向于将“枯萎”与构造相关联,而不是访问。
这是圆的正交,您找不到?
实际上不,这仅仅是因为我的目的以来我一直在错误的轨道上,而这开始了我很懒惰的批评!
- 我的班级将被称为“
ConnectionsConfiguration
”,带有“ s”和一个完整的单词(停止快捷方式,不是另外7个特征会影响您的生产力) - 只有一个“
connection(string $name)
”返回对象“ConnectionConfiguration
”(因此没有“ s”) -
ConnectionConfiguration
具有三个setDriver()
,primary()
和replica()
Menes,其中最后两个返回可变ServerConfiguration
。 -
ServerConfiguration
包含四个MedodssetHost()
,setCredentials()
,getHost()
和getCredentials()
获得ServerHost
和ServerCredentials
对象
最后,代码将是:
<?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')
;
对于setHost
和setCredentials
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â©: p>
- 将自己从使用的角度放置,而不是含义
- 不要过多创新,人们有习惯
- 永远不要懒惰
- 使用简短的不变性
- 请注意状态对象上的流利接口
- 阅读Kréün,这是一本漫画书