
Linuxのcpコマンドでは
cp A B でAがBにコピーされますが、
Cの関数strcpy()では
strcpy(A,B) で、BがAにコピーされます
どちらの方向が正解ということは無いですが、混乱してしまいます。
自作の関数でも、その時の気分で方向が一定せず、再利用するときに、混乱してしまいます。
例えば、f(A,B) の標準を代入文と同じ A=B にしておいて、
逆の方向の場合は f_fromtoなど関数名で区別する
というのを思いつきましたが、逆方向の場合の関数名が長くなって使いにくいです。
混乱を回避するために皆さんが行っている工夫、ありましたら教えてください。
No.4ベストアンサー
- 回答日時:
言い訳がましい理由ですが、「先」になるものを第1引数にすることは良くあります。
というのも、関数に限らず、処理全般には「入力」と「結果」があると思いますが、往々にして結果は一つであり、機能拡張などによって引数が増える要素は入力の方が圧倒的に多いと感じています。なので、もし(下手くそなプログラミングによくありがちな)関数の引数を増やす必要に迫られた場合は、入力にあたるものを引数の後ろに増やしていくことで若干整合性が取りやすいかな、と思います。
例)
func(input, output);
↓
func(input, output, input2, ...);
func(output, input);
↓
func(output, input, input2, ...);
あとは、入力要素が多いときは、No.1の方がかなり否定的に書かれていますが、構造体を使ったりすることは実際にあります。たとえばpthread_create()みたいな感じの使い方です(pthread_create()は引数を4つ取るが、ユーザ定義の情報の引き渡しは第4引数のvoid *に限られる)。
>入力にあたるものを引数の後ろに増やしていくことで若干整合性が取りやすい
なるほど! func(output, input, input2, ...); ですね。
素晴らしい、覚えやすいルールです。
ありがとうございます。
No.5
- 回答日時:
関数のリストを作成するとか
使っているエディタで関数名の上にカーソルを置くとそれを表示させるようなソフトを作るとか
(あ、もちろん私は使っていないです。作るような能力ありませんから)
回答ありがとうございます。
なるほど、取説で解決する方法ですね。
私もそのようなソフトを作る能力ありませんが、そのような解決策もありですね。
No.3
- 回答日時:
C言語以外の言語になりますが、関数の第1引数に特別な意味を持たせる場合があります
https://tour.dlang.org/tour/ja/gems/uniform-func …
https://docs.python.org/ja/3/faq/design.html#why …
これらは、関数とメソッドの相互運用性を高めるための工夫ですが、
そもそもの前提として、処理対象は関数の第1引数に指定すべき、
という認識があるようです。
この認識にしたがって、主体となる処理対象が明確な場合は、
方向とは関係なく第1引数に主体を指定させます。
主体を考慮したメソッド名ならば、まず混乱することは無いでしょう。
例)
inputData(主体, 送信元)
outputData(主体, 送信先)
両側が対等で主体が無いならば仕方がないので、
標準関数である memcpy と同じという理由で、
後ろから前に指定させます。
例)
copy(送信先, 送信元)
回答ありがとうございます
主体を関数の第1引数に指定するという考えですね。
いろんな考え方があるのですね。参考にさせていただきます。
No.2
- 回答日時:
#1 のポイントは, C99 以降 (#1 では「C99 or after」と書いてしまったが, 英語だと「C99 or later」であるべきかなぁと今思った) では
構造体オブジェクトを構築するときに (構造体の定義の順とは関係なく) メンバーを指定して初期化できる
ことで, 結果として「引数の個数が固定」の場合には順序に関係なく 1つの関数で全て対応できるようになる. 大きな欠点は
・関数ごとに構造体が必要となる
・いちいち構造体オブジェクトを作らなきゃならない
ことで, さすがに面倒くさすぎる.
と, これは完全に冗談で書いた案なわけだけど, 普通には
自分の中で (ある程度) 固定しておく
という作戦を採用するところかなぁ. C の関数だとだいたい
後ろから前
になってるはず (未確認) なので, それに従っておくとか. 少なくとも「その時の気分で方向が一定せず」というのはちょっと, ねぇ.
実現例のある方法としては, 例えば FROM や TO という定数を用意したうえで
copy(FROM, A, TO, B)
と呼び出すってのもあるけど... 関数の中で死にそうな気もするな.
再度、回答ありがとうございます
>自分の中で (ある程度) 固定しておく
そうなんですが、
>少なくとも「その時の気分で方向が一定せず」というのはちょっと, ねぇ.
こちらもそうなんですが、5年、10年と気分を一定させ続けるのもかなり難しいものです。
>C の関数だとだいたい
>後ろから前
Tacosanさんは、このルールで運用中ということでしょうか。参考にさせていただきます。
No.1
- 回答日時:
引数を構造体にしちゃえば
なんちゃって named argument
にできる (C99 or after) から完全に解決できる... かな.
できたとしても絶対やらんけど.
回答ありがとうございます
なるほど、構造体にすれば順序関係ないですね。
また copy( from:A, to:B); のようにnamed argumentにできれば、順番は関係ないですね。
>できたとしても絶対やらんけど.
たしかに。逆の方向の場合は f_fromtoなど関数名で区別するのと手間は変わらなそうですね。
でもアイデア感謝します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP 【スプレッドシート】順位のつけ方 2 2022/08/17 13:27
- 戸籍・住民票・身分証明書 役所の行政事務は簡単な方が良いですね? 1 2023/06/12 23:36
- 化学 参考書で混成軌道(sp3混成軌道)の説明として、以下のような文がありました。 「例えば、2s、2px 1 2023/03/13 13:27
- 数学 リーグ戦で昇級、降級の考え方 5 2022/06/19 14:28
- 工学 疑似乱数生成器 3 2023/01/05 02:06
- 数学 よく混ざった状態とは? 3 2023/05/30 16:49
- その他(プログラミング・Web制作) プログラミング pythonの問題について 2 2022/04/19 00:41
- 数学 「f(z)=1/(z^2-1)に関して ローラン展開を使う場合、マクローリン展開を使う場合、テイラー 3 2022/08/27 19:56
- その他(ゲーム) ポケモン乱数 色違い 伝説 HGSS(ハートゴールド・ソウルシルバー) 1 2022/05/06 13:13
- その他(ビジネス・キャリア) 社長が現場に口を出す心理を教えてください。 零細企業に勤めているのですが、社長がとにかく現場に口を出 2 2022/10/15 12:30
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAのプログラムで、DIAG = 1# ...
-
charで宣言した変数をstringへ...
-
Integer変数をカラにしたいので...
-
整数から16進数への変換 現在c...
-
VBAにてcolorindexを変数に格納...
-
typedefをプログラム中で解除す...
-
Schemeのコンストラクタの引数は?
-
構造体の初期化方法について
-
列挙子(enumlator)の内容を文字...
-
値が代入されてない時
-
FILE構造体がどのように定...
-
「#undef」と「#define」の使い...
-
構造体にする理由・利点・使用例
-
命名規則 VB 構造体
-
C++ 構造体の一括初期化 {0}
-
構造体のデータを丸ごとコピー...
-
C言語 構造体の中に共用体を定...
-
異なる構造体のデータのコピー
-
VBAの変数のデータ型を変更する...
-
変数の初期化について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAのプログラムで、DIAG = 1# ...
-
Integer変数をカラにしたいので...
-
「#undef」と「#define」の使い...
-
C言語 構造体の中に共用体を定...
-
構造体のデータを丸ごとコピー...
-
VBAの変数のデータ型を変更する...
-
日付チェック関数について
-
整数から16進数への変換 現在c...
-
typedefをプログラム中で解除す...
-
値が代入されてない時
-
C++ 構造体の一括初期化 {0}
-
VBAで符号無し整数
-
long型のデータをバイト型の配...
-
変数の初期化について
-
1バイトデータの読み出しについて
-
charとucharの違い
-
VBAにてcolorindexを変数に格納...
-
異なる構造体のデータのコピー
-
構造体を型の異なる構造体に代入
-
構造体にする理由・利点・使用例
おすすめ情報