$o = new FooBarObject();
$o->setFoo('foo');
$o->setBar('bar');
こういうのを Fluent setter/getter でメソッドチェーンして複数行で書くときどう書くか、コーディング規約で決まってないので、人によって改行位置が違ってきて関係ない diff が発生するのがよくあります。こういう指針でどうかなと思ってるのをまとめました。
class FluentObject
{
private string $foo, $bar, $baz;
public function setFoo($v): self { $this->foo = $v; return $this; }
public function setBar($v): self { $this->bar = $v; return $this; }
public function setBaz($v): self { $this->baz = $v; return $this; }
public function getFooBarBaz(): string { return $this->foo . $this->bar . $this->baz; }
}
// 複数行でどう書く?
セッター呼び出しのみの場合、最初の要素開始と最後のセミコロンの前につねに改行。順序が変わったり任意の場所にメソッドが挿入されたりするので、セミコロンや先頭行との影響をなるべく減らし、純粋な行差分にしたいです。データレコードのフィールド初期化などに多いパターン。
$o = (new FluentObject())
// 最初に setBaz を挿入するかもしれないので改行してから
->setFoo('foo')
->setBar('bar')
// 最後に setBaz を挿入するかもしれないのでセミコロンを次の行に
;
最後のメソッドが別の型を返す場合、最後のメソッドはセミコロンと同じ行に。必要ないのにセミコロンだけ浮いてる行はやっぱり無駄なので。クエリビルダなどに多いバターン。
$s = (new FluentObject())
->setFoo('foo')
->setBar('bar')
->getFooBarBaz();
// getFooBarBaz の次になにか挿入される可能性はないのでセミコロンとセット
最初のメソッドがお約束で決まっている場合、可変な要素が出てくるまではなるべく改行しない。$this->createMockBuilder(...)
でおなじみのパターン。
class FluentObjectFactory
{
public function create(): FluentObject{ return new FluentObject(); }
}
$o = (new FluentObjectFactory())->create()
// create の前になにか挿入される可能性はないので改行なし
->setFoo('foo')
->setBar('bar')
;
結論: 構文では決まらないよね。セマンティックだよね。
いかがだったでしょうか? ご意見はコメントでどうぞ。