Thread Rating:
  • 389 Vote(s) - 2.89 Average
  • 1
  • 2
  • 3
  • 4
  • 5
引数の定義はキーワードor位置 どちらがよい?
09-19-2013, 09:21 AM, (This post was last modified: 09-26-2013, 02:40 PM by umemura.)
#5
RE: 引数の定義はキーワードor位置 どちらがよい?
nasuBさん、wbardwellさん、アドバイスありがとうございます。

いまでは、私は、位置引数を利用するケースは下記の3つだと考えています。
・必須の場合
・ひとつのみの場合
・順番に意味がある場合

たとえば、Frameクラスであれば、「ひとつのみ」のグラフィックを受け取りますし、
VBox であれば、複数のオブジェクトをプログラマが意図した順番(=引数の順番)に並べます。

しかし、marry1プロシージャの場合「複数の引数」を「位置引数」で受け取りますが、
引数の順番はプロシージャ側が勝手に決めたものです。
プログラマが、誤った順番でコーディングしてしまった場合、
プログラマは、プロシージャ中身をドキュメント等で読み、仕様を理解しないといけません。
これは、プログラマにとって、使いづらいプロシージャです。

そのため、「複数で、かつ順番にはあまり意味がない引数」を渡す場合には、
どのような仕組みがよいのか、このスレッドで質問指させてもらいました。

私は、皆さんがこの問題をどのように解決しているのか興味があります。
もしかしたら、「複数で、かつ順番にはあまり意味がない引数」を渡さなければいけないような設計自体が間違っており、
もっとよい設計やデザインパターンがあるのではないかと期待しています。

今のところ、私は、「必須だが、複数で、かつ順番にはあまり意味がない引数」を渡す方法を以下の種類で考えています。

①引数に意味を持たせる・・・クラスでラップし、フィールドにフラグを持たせる、等
②キーワード引数を利用する
③引数をまとめた、受け渡し専用のクラスを作成し、利用する(チェックを行うのは②と同様)


①は nasuBさんの方法で、「順番に意味がないかわりに、引数の中に意味を持たせる」という方法です。
これには、プログラマが、より多くのクラスを意識する必要がある、という小さなデメリットと、
コードが非常に読みやすくなるという大きなメリットがあると思います。


②は、キーワード引数の名前で、引数の意味を表すことを目的としています。
引数の型はNullableにせず、初期値にuninitialized-value-for-type を利用します。
その引数の値が必須であれば、受け側でkeyword-supplied? を利用したチェックを行い、
指定されていなければエラーをスローします。

Code:
{define-proc public {calc-add
                        default:int = {uninitialized-value-for-type int},
                        target:int = {uninitialized-value-for-type int}
                    }:int
    def error-msg = "default と target には必ず値を指定してください"
    {assert {keyword-supplied? default}, error-msg}
    {assert {keyword-supplied? target}, error-msg}
    {return default + target}
}
{CommandButton
    label = "指定なし",
    {on Action do
        {popup-message {calc-add}}
    }
}
{CommandButton
    label = "片方のみ指定",
    {on Action do
        {popup-message {calc-add default = 10}}
    }
}
{CommandButton
    label = "正しく指定",
    {on Action do
        {popup-message {calc-add default = 3, target = 9}}
    }
}


③は、②とよく似ています。
受け渡し専用クラス(DTO)を用意し、値のチェックなどを、このクラスの中で行うことで、
プロシージャ内に余計なロジックを入れずに済みます。

ただし、②と③は、実行するまで、エラーになるのかどうかわからないことが問題です。

もっと良い方法や別のアイディアがあれば、アドバイスをいただけるとうれしいです。


Messages In This Thread
RE: 引数の定義はキーワードor位置 どちらがよい? - by umemura - 09-19-2013, 09:21 AM
Forum Jump:


Users browsing this thread:
2 Guest(s)

MyBB SQL Error

MyBB has experienced an internal SQL error and cannot continue.

SQL Error:
1017 - Can't find file: 'mybb_threadviews' (errno: 2)
Query:
INSERT INTO mybb_threadviews (tid) VALUES('963')