ホームページ  >  記事  >  バックエンド開発  >  PHP マルチパラメータ メソッドのリファクタリング (コード例)

PHP マルチパラメータ メソッドのリファクタリング (コード例)

藏色散人
藏色散人転載
2019-01-09 14:12:522983ブラウズ

記事を保存する関数を完成させたいとします。関数型プログラミングを使用すると、おそらく次のようになります:

<?php
function saveArticle($title, $content, $categoryId)
{
    // ...
}
?>

各パラメータは属性を表しますが、問題が発生します。パラメータ リストは次のようになります。とても長くなりました。このとき、オブジェクト プログラミング テクノロジを使用するとよいでしょう。

<?php
class Article
{
    var $title;
    var $content;
    var $categoryId;
    function save()
    {
        // ...
    }
}
?>

ここでは、元のメソッド パラメータがオブジェクトの属性に変換され、メソッド パラメータの数が大幅に削減されます。ほとんどの場合、この方法は適切ですが、すべてのパラメーターがオブジェクト属性の形式で存在するのに適しているわけではありません。区別の原則は、これらのパラメーターがオブジェクトの固有属性に属するか、外部特性に属するかを確認することです。区別しないと、それらはすべてオブジェクトのプロパティに変換され、オブジェクト自体が意味を持たなくなります。

たとえば、Article オブジェクトには find という名前のメソッドもあります。これを使用する場合、制限、オフセット、順序などのパラメータが関係する可能性があります:

<?php
class Article
{
    var $title;
    var $content;
    var $categoryId;
    var $limit = 10;
    var $offset = 0;
    var $order = &#39;created DESC&#39;;
    function save()
    {
        // ...
    }
    function find($categoryId)
    {
        // ...
    }
}
?>

上に示すように、Once limit、offset、order などのパラメータをオブジェクトの属性に変換すると、オブジェクト自体は目立たなくなります。これは、title、content、categoryId はオブジェクトの固有属性として数えることができますが、limit、offset、order はそうではないためです。それらはせいぜい外面的な特徴としてしか考えられず、それらを区別しないと悪夢の始まりとなります。したがって、外部特性をメソッドのパラメータに正直に含める方が良いです (より厳密に言うと、find メソッドは静的型メソッドである必要がありますが、本文は簡単な説明なので、詳しく説明する必要はありません):

<?php
class Article
{
    var $title;
    var $content;
    var $categoryId;
    function save()
    {
        // ...
    }
    function find($categoryId, $limit = 10, $offset = 0, $order = &#39;created DESC&#39;)
    {
        // ...
    }
}
?>
可惜如此一来又出现了文章开头所说的问题,find方法的参数太多了,缺乏可读性,所以还得重构:
<?php
class Article
{
    var $title;
    var $content;
    var $categoryId;
    function save()
    {
        // ...
    }
    function find($categoryId, $options = array())
    {
        $default = array(
            &#39;limit&#39; => 10,
            &#39;offset&#39; => 0,
            &#39;order&#39; => &#39;created DESC&#39;
        );
        $options = array_merge($default, (array)$options);
         // ...
    }
}
?>

見た目はかなり良さそうです。呼び出し時に次のようなメソッドを使用できます:

$article->find(123, array(&#39;limit&#39; => 20));

簡単に言うと、配列パラメータを使用して、キーワード パラメータと同様の効果をシミュレートします。この方法で、配列のキー名を使用してパラメータの機能を説明できるため、コードの可読性が向上します。このようなリファクタリング手法はCakePHPなどのプロジェクトで広く使われており、しっかり理解しておけば、今後コードを書くときに直感的に可読性の高いコードを書くことができます。

補足: array_merge と比較すると、$options = $default; を使用することも良い選択です。さらに、オプションのロジックが非常に複雑な場合は、配列の代わりに配列を使用して、特別なオブジェクトを使用して論理操作をカプセル化することもできます。

以上がPHP マルチパラメータ メソッドのリファクタリング (コード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事は歪麦で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。