abstractメソッドやめてデフォルト挙動を実装しておいてくれよ、というお話

とあるabstractクラスを意識高い系の新人が作ってくれていて。
継承して利用としようとしたらabstactメソッドの実装求められたんです。
確かに言語機能ね。でも私の今から作るクラスではこの実装は責務ではない気がしたの。
abstractクラスで継承すれば良いんだろうけど「違う、なんかそうじゃない」という違和感を感じた。
違和感を掘り下げると

  • abstractはどのような挙動をする実装を期待しているのを追うのが面倒ということで利用する側に負担かかるじゃん
  • 実装者はabstractメソッド書いた瞬間に利用者に対して怠慢を働いているのではないだろうか

ということを考えました。
今回はデフォルト実装を行うことにします。
abstractの怠慢の鎖をここで断ち切るのです。
既存を変更したら再テストが必要だから親クラスには手を加えない。

<?php

abstract class H 
{
    abstract protected function hoge();
}

abstract class I extends H 
{
    protected function fuga()
    {
        return 1;
    }
}

class J extends I 
{
    protected function hoge()
    {
        $this->fuga();
        return 2;
    }
}