NOEMBLEM/エンブレムが設定されていません。

メールの詳細(トピック表示)

関数引数の順序

投稿者: さん  2004/02/13 11:08  MLNo.422   [メール表示]

京都産業大学の山田と申します.

自作関数の引数順序を決める際に,どのようなポリシーで決めるのが一般的なのか,
を知りたくて,投稿させていただきました.


質問1
データを a から b に移動させる関数 f の引数は,
  f(a, b) の順序にすべきか, f(b, a) の順序にすべきか.

一つの慣例
標準ライブラリの strcpy などは f(b, a)の順序になっていますが,
これは, b = a; という代入文からの連想であると思われます.

移動方向を重視
データの流れからすると, f(a, b) となります.

自然言語の順序
英語(あるいは日本語)などの自然言語での順序に従うという方法もあります.
move a to b (a を b に移動させる)
という文の順序に従うと, f(a, b) となります.


質問2
データ値 x をデータの受け皿 a に入れる関数 f の引数は,
f(x, a) の順序にすべきか, f(a, x) の順序にすべきか.

一つの慣例
標準ライブラリ sprintf などは, f(a, x) の順序になっています.
これは可変長引数関数であるがために,データが最後になるのは仕方ないと思われ
ます.

データの移動方向を重視
データの流れからすると, f(x, a) となります.

自然言語の順序
たとえば「データ x をスタック a にプッシュする」という日本語の順序では
f(x, a) となります.英語でも 「push x down to a」となりますので,
f(x, a) です.
日本語なら「スタック a に x をプッシュする」とも表現できますが,
主たる目的語を先にする,という原則にそっている日本語は,先ほどの文だと言え
ます.


その他,「データ x を,データ受け皿 a の, k 番目の場所に入れる」という関数
の場合は,
どうするか,など頭を悩ませてます.

皆様のご意見が伺えれば幸いです.




このエントリーをはてなブックマークに追加


  • MLNo.423   FUJIHARA Keiichiさん  (0) 2004/02/13 12:37  [メール表示する]
    藤原と申します。

    This message is reply to Shuji YAMADA - san
    (Subject was : [beginers:0422] 関数引数の順序)

    Message-ID: <20040213020850.B98EB758B2@…>
    in Fri, 13 Feb 2004 11:08:50 +0900 ...

    > 自作関数の引数順序を決める際に,どのようなポリシーで決めるのが一般的なのか,
    > を知りたくて,投稿させていただきました.
    >

    「統一性があればどちらでも良い」
    が基本です。

    あとは、一緒に使うライブラリがあれば、それに合わせる程度ですね。


    --
    _/ -- Last 4382 hours until ATHENS 2004 Olympic Games -------------
    _/ FUJIHARA Keiichi
    _/ E-Mail : nagi@…
    _/ URL : http://www.asahi-net.ot.jp/~ig5k-fjhr/
    ------------------------------------------+----- Luna Phase 21.73 --
    PGP FingerPrint = 7CC3 4F95 8CC7 87D3 7178 C348 CD65 7F08 D68F 69F6



  • MLNo.424   "Isao SHIMAKURA"さん  (0) 2004/02/13 15:21  [メール表示する]
     島倉です。

     直接の回答ではなく、推測を多分に含む個人的な意見ですが、ヒ
    ントになれば。

    > 質問1
    > データを a から b に移動させる関数 f の引数は,
    >   f(a, b) の順序にすべきか, f(b, a) の順序にすべきか.

     古くからコンピュータに触れている人間にはアセンブリ言語の記
    述が染み付いていると考えられます。

     インテル系 mov b,a
     モトローラ系 move a,b

     しかし、C言語が生まれたUNIXワークステーションではモトロー
    ラ系のCPUが使われていたので、このことが直接の理由では無いよ
    うです。

    > 一つの慣例
    > 標準ライブラリの strcpy などは f(b, a)の順序になっていますが,
    > これは, b = a; という代入文からの連想であると思われます.

     これは、C言語では引数を関数に渡す際に、値を後方から順にス
    タックする仕様が標準になっているため、関数側に都合の良いよう
    に順序を決めていたと思われます。
     スタックの値は先入れ後出しなので、関数側では取り出した値を
    順に処理すれば良く、ロジックを単純化できるというメリットがあ
    ります。#ただし関数側をアセンブリ言語で記述するような場合。

    > 質問2
    > データ値 x をデータの受け皿 a に入れる関数 f の引数は,
    > f(x, a) の順序にすべきか, f(a, x) の順序にすべきか.
    >
    > 一つの慣例
    > 標準ライブラリ sprintf などは, f(a, x) の順序になっています.
    > これは可変長引数関数であるがために,データが最後になるのは仕方ないと思われ
    > ます.

     可変長引数でデータが後になるのは先に書いた、先入れ後出しの
    スタックに対して後方から引数を積むことが理由です。

    > その他,「データ x を,データ受け皿 a の, k 番目の場所に入れる」という関数
    > の場合は,
    > どうするか,など頭を悩ませてます.

     C++では引数の省略値を指定できますが、これは後方の引数に限
    られます。
     例えば、

     f(char *a, int x, int k = 0);

    と宣言された関数fは

     f(a, x);

    と呼び出すことができ、その場合関数側でkには0が代入されていま
    す。

     言語仕様として、省略させたい要素は後方に置くことが要求され
    ているわけです。
     また、xの型が異なる関数のバリエーションが考えられますが、
    この場合、引数の省略の構文とあわせて考えると、変化の少ない
    (と考えられる)aを前方に、変化が多いと思われるxを後方に置くの
    が自然と思われます。


     あくまで、わたし個人の考え方ですので、一例と捉えてください。

    Isao SHIMAKURA (ISLe)
    isle.shimakura@…

    ----- Original Message -----
    From: "Shuji YAMADA" <yamada@…>
    To: <beginers@…>
    Sent: Friday, February 13, 2004 11:08 AM
    Subject: [beginers:0422] 関数引数の順序


  • MLNo.425   さん  (0) 2004/02/14 00:07  [メール表示する]
    藤原様,島倉様,さっそくのレスポンス有り難うございます.

    > 「統一性があればどちらでも良い」
    > が基本です。
    >
    > あとは、一緒に使うライブラリがあれば、それに合わせる程度ですね。

    そのとおり,統一性があればどちらでも良いのですが,
    でも,どれに統一しようか,迷っているのです.

    もしも,ライブラリなど,過去の遺産にとらわれないとすると,
    どのような引数順序になさるか,を聞かせて頂ければ大変参考になります.

    >  古くからコンピュータに触れている人間にはアセンブリ言語の記
    > 述が染み付いていると考えられます。
    >
    >  インテル系 mov b,a
    >  モトローラ系 move a,b
    >
    >  しかし、C言語が生まれたUNIXワークステーションではモトロー
    > ラ系のCPUが使われていたので、このことが直接の理由では無いよ
    > うです。

    う〜ん,私も古い記憶が蘇って来ました.そう言えば二つの順序で
    混乱した憶えがあります.
    (PC8001に直接機械語を打ち込んでいた頃もあったな〜.年がばれそう)

    > 一つの慣例
    > 標準ライブラリの strcpy などは f(b, a)の順序になっていますが,
    > これは, b = a; という代入文からの連想であると思われます.
    >
    >  これは、C言語では引数を関数に渡す際に、値を後方から順にス
    > タックする仕様が標準になっているため、関数側に都合の良いよう
    > に順序を決めていたと思われます。
    >  スタックの値は先入れ後出しなので、関数側では取り出した値を
    > 順に処理すれば良く、ロジックを単純化できるというメリットがあ
    > ります。#ただし関数側をアセンブリ言語で記述するような場合。

    そういう理由があったとは,まったく知りませんでした.
    しかし,今の時代,他に気にすることが多すぎて
    そこまでの細心の注意が払えるかどうか...

    >  C++では引数の省略値を指定できますが、これは後方の引数に限
    > られます。

    >  言語仕様として、省略させたい要素は後方に置くことが要求され
    > ているわけです。
    >  また、xの型が異なる関数のバリエーションが考えられますが、
    > この場合、引数の省略の構文とあわせて考えると、変化の少ない
    > (と考えられる)aを前方に、変化が多いと思われるxを後方に置くの
    > が自然と思われます。

    確かに,C++などの省略値があるものは,そのような順序になりますね.

    有り難うございました.




  • MLNo.426   FUJIHARA Keiichiさん  (0) 2004/02/14 09:19  [メール表示する]
    藤原です

    This message is reply to 山田 修司 - san
    (Subject was : [beginers:0425] Re: 関数引数の順序)

    Message-ID: <82F9A38D-5E36-11D8-A927-0003936667E8@…>
    in Sat, 14 Feb 2004 00:08:42 +0900 ...

    > もしも,ライブラリなど,過去の遺産にとらわれないとすると,
    > どのような引数順序になさるか,を聞かせて頂ければ大変参考になります.

    いずれの方法も考えられると言うことは、ようするに、「どっちでもいい」
    ということなので、少なくとも、from と to の順序などは、(関数名の
    動詞と目的語の順序と同じで)好きに決めればいいというレベルのものです。
    それよりも、やはり、統一性が崩れていることの方がはるかに多いですね。

    もう少し範囲を広げるなら、

    1)プロトタイプではそれとわかるような変数名を使う
     
    void move(int *to, int *from);

    2)極力関数形式にする

    a = move(b);
     ただし、C言語の範囲では限界はあります。
     それでも、構造体を返す関数なども定義できるので、不自然にならない
     程度に関数形式にすることも考慮します。

     C++なら、標準関数(のクラス)に、string があるので、ほぼ
     関数形式にできます。

    3)ライブラリの中で大半の関数に渡す必要のある引数は先頭にする

     拡張ボードなどのライブラリはこの形が多いですね。

    4)オプショナルな引数は後ろにつける

     void move(char *to, char *from)
    void moveStart(char *to, char *from, int start)
    void moveStartN(char *to, char *from, int start, int len);
    このあたりの、標準―オプショナルという関数の関係を考慮しないと、
     統一性の崩れにつながります。
     C++なら、この場合は、関数の名前を変える必要はないかなと思います。

    というところですかね。
     


    --
    _/ -- Last 4361 hours until ATHENS 2004 Olympic Games -------------
    _/ FUJIHARA Keiichi
    _/ E-Mail : nagi@…
    _/ URL : http://www.asahi-net.ot.jp/~ig5k-fjhr/
    ------------------------------------------+----- Luna Phase 22.64 --
    PGP FingerPrint = 7CC3 4F95 8CC7 87D3 7178 C348 CD65 7F08 D68F 69F6




メールへの返信はMLのメンバーしかできません。

更新順メールリスト