X



「メソッド名」分ける必要なくね?【オーバーロード】 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
垢版 |
2017/07/30(日) 12:09:40.60ID:BhqS0uaq
これは完全に俺の理論なんだが
・例えばメソッド名は「any」とか「do」とか統一でいいと思う。
 (引数個数と型によって呼ばれるメソッドが変わるオーバーロードがあるから)
・慣れたプログラマだったらコード読むときにメソッド名はなく引数でとか
 静的型付け言語だったら型で処理を判断するだろ。
・メソッド名は同じクラス内で引数の型と個数、戻り値型が
 全部被って初めて分けるべきだと思う。
・可読性はそんなに落ちないと思う。
落ちたとしても、print 系コマンドで値を出力する記述の手間が
格段に上がる(メソッド名を変えなくていい)し、
引数のバリエーションを変えて、挙動の確認が
やりやすくなる。デバッガを使えば、中間状態の値なんて簡単に
 確認できる。だからメソッド名分ける必要はない。
・反対にメソッド名統一しとけば保守性、互換性、拡張性は格段に上がる。
・さらに特定の意図をもって「methodA」や「methodB」みたいに「グループ化」
 するという使い方をすれば、何らかの使い分けできて便利だと思う。
・いちいち長いメソッド名を「メソッド1つ1つ」に割り当てて「意味付け」する
 必要が全くない。
0002デフォルトの名無しさん
垢版 |
2017/07/30(日) 12:12:09.52ID:MHvXlxdG
素直にメソッド名つけるのが苦手です
どうしたらいいんでしょうか?って書けよw
0003デフォルトの名無しさん
垢版 |
2017/07/30(日) 12:24:05.73ID:BhqS0uaq
>>2 違う。
「メソッド名が同じ」なら、「引数変えるだけ」で「挙動が変えられる」
から。
デバッグしながらコーディングがしやすくなるから。
オブジェクトを変えただけでエラー無しで挙動が変えられるようになるから。
0004デフォルトの名無しさん
垢版 |
2017/07/30(日) 12:33:11.18ID:MHvXlxdG
訂正

「メソッド名が同じ」だと、「引数変えなければ」で「挙動が変えられない」
0005デフォルトの名無しさん
垢版 |
2017/07/30(日) 12:40:12.10ID:BhqS0uaq
>>4
それもちょっと違う。
だから>>1で、「引数のシグニチャがかぶった時だけ」メソッド名を
変える必要があるって言ってるし。
どのみちメソッド名変えても「引数が適合していなければエラーになる」
同じ名前にしておけば、「引数が適合するメソッドが自動的に選ばれる」。
こういうことをいいたんだよ。
つまり、一見ソースの可読性が悪くても、コンソール出力で引数ごちゃごちゃ
いじって動作を確認しているうちに、偶然「欲しかった結果」が何故か出てくる
って感じで呼び出し側でコーディングできる。
(返り値voidの内部状態変更系メソッドは厳しいかも。メソッド名必要かも)
0006デフォルトの名無しさん
垢版 |
2017/07/30(日) 12:42:39.38ID:MHvXlxdG
はい訂正w

「引数のシグニチャがかぶった時は」
「メソッド名が同じ」だと、「引数変えなけれ」ば「挙動が変えられない」
0007デフォルトの名無しさん
垢版 |
2017/07/30(日) 12:43:42.88ID:MHvXlxdG
引数変更しないといけないなー

あー、シグネチャが他とかぶってしまったー

名前変えなきゃー

最初っから別の名前にしておけば良かったなー


うははははあh
0008デフォルトの名無しさん
垢版 |
2017/07/30(日) 12:49:34.97ID:BhqS0uaq
>>7
シグニチャはそんなにかぶらないと思う、
頻繁にかぶるとしたらなんらかの機能が重複してる可能性あるよ
「同じクラス内で全く同じ引数のパターンをとるメソッド」って
統合したほうがいいんじゃないかな? なんらかの設計に無駄があるよ。
(流石にString 1つとか int 1つとかは複数必要になるかもだが。)
0009デフォルトの名無しさん
垢版 |
2017/07/30(日) 12:54:00.02ID:MHvXlxdG
Mathライブラリで引数が数値じゃないのって何があったかなーwww

引数がないメソッドって世の中いくつあんだろーwww
0012デフォルトの名無しさん
垢版 |
2017/07/30(日) 13:08:13.85ID:BhqS0uaq
>>11
う〜〜んMathもjQueryも「数学」「DOMオブジェクト」って
特化してるからなぁ「手続き(アルゴリズム)」の隠蔽系のメソッド
には確かに対応できないかもな、「ユーティリティ」って感じじゃないか?
でも普段俺ら一般人はこういうライブラリはもっぱら「使う」側で
あまり設計したり定義したりするわけじゃないだろ。

普段定義しているいろんな型のオブジェクトを生成して引数のやり取りが
多様になるアプリケーションなら俺の言っていることも間違っていないはず。
0013デフォルトの名無しさん
垢版 |
2017/07/30(日) 13:14:08.26ID:Qh6Uum8+
似た機能をまとめるのはいいと思うけど
ぜんぜん違う機能を一緒にしたらあとから見たときにわけわからなくなるだろうな
0014デフォルトの名無しさん
垢版 |
2017/07/30(日) 13:15:43.11ID:MHvXlxdG
ほーらよ。お馬鹿なお前に付き合って関数を全部anyにしてやったぜww
できるっていうなら、どれがどんな関数なのか判断してみーwww
http://9cguide.appspot.com/r_lib.html

FILE *any(const char *filename, const char *mode); // ファイルを開く
int any(FILE *fp); // ファイルを閉じる
int any(FILE *fp); // ファイルから1文字読み出す。
int any(FILE *fp); // ↑と全く同じ
char *any(char *s, int n, FILE *fp); // 面倒だからあとはシグネチャで判断しろよ?w
int any(int c, FILE *fp);
int any(int c, FILE *fp); ↑と全く同じ
int any(const char *s, FILE *fp);
size_t any(void *ptr, size_t size, size_t nelem, FILE *fp);
size_t any(const void *ptr, size_t size, size_t nelem, FILE *fp);
int any(FILE *fp, const char *format, ...);
int any(FILE *fp, const char *format, ...);
long any(FILE *fp);
int any(FILE *fp, long offset, int ptrname);
int any(FILE *fp, fpos_t *ptr);
int any(FILE *fp, const fpos_t *ptr);
int any(FILE *fp);
int any(FILE *fp);
void any(FILE *fp);
int any(FILE *fp);
FILE *any(const char *filename, const char *mode, FILE *fp);
int any(const char *oldname, const char *newname);
int any(const char *filename);
int any(void);
int any(char c);
char *any(char *s);
0015デフォルトの名無しさん
垢版 |
2017/07/30(日) 13:25:06.77ID:BhqS0uaq
>>14
これでいい。判断は必要ない。引数値を与えてみて、その場で「結果」
を確認すればいい。
しかもこれC言語の「関数」だろ。
オブジェクト指向のメソッドじゃないだろ。
つまり沢山の「クラス型」が出て来る言語じゃないだろ?

char data[255] = "abcde";

fp = any("foo.txt", 'w');
any(fp, data);
any();
0016デフォルトの名無しさん
垢版 |
2017/07/30(日) 13:31:38.15ID:BhqS0uaq
>>11
もう1ついうとこれらもさっきのjQueryと同じで
Cの根幹を成す基本の関数だろ?
俺らが普段「設計」し「定義」するのはこういうのじゃなくて
アプリケーションのメソッドだよ。
0018デフォルトの名無しさん
垢版 |
2017/07/30(日) 13:32:55.81ID:MHvXlxdG
>>16
> 俺らが普段「設計」し「定義」するのはこういうのじゃなくて
> アプリケーションのメソッドだよ。

具体的の10行(10メソッド)ぐらいの意味があるコードを書いてみやがれ
0019デフォルトの名無しさん
垢版 |
2017/07/30(日) 13:51:47.16ID:BhqS0uaq
>>18
ごめん、たしかに間違えた、あとCはそんなに詳しくないのに書いた。
でも実際に実行してみれば「ファイルストリーム」ができたのでなく、
「リネームされた」ってその場で気付ける。

例えば、Javaですまんがこんな感じだ。「関数型プログラミング」
に近いかも。

public abstract Foo{
public abstract void any();
public abstract void any(String arg);
public abstract void any(String[] args);
public abstract void any(int arg);
public abstract void any(Foo arg);
public abstract String toString();
public abstract String toString(String arg);
public abstract String toString(String[] args);
public abstract String toString(String arg1, String arg2);
public abstract String toString(String str, int i);
}
0021デフォルトの名無しさん
垢版 |
2017/07/30(日) 13:56:29.59ID:MHvXlxdG
> 例えば、Javaですまんがこんな感じだ。「関数型プログラミング」
> に近いかも。

は? どこが?www
関数型プログラミングを知らないくせに
俺、すげーっとか考えてるだろwwww
0022デフォルトの名無しさん
垢版 |
2017/07/30(日) 14:01:07.63ID:BhqS0uaq
>>19
えぇ?そこは主題じゃないんだが・・・
まあいいや上の3つだけ書くよ。

public void any(){
System.out.println("Hello");
}

public void any(String arg){
System.out.println("Hello" + arg);
}

public void any(String[] args){
for(int i = 0; i < args.length; i++){
System.out.println("Hello" + args[i]);
}
}

あとは皆同じ。
0023デフォルトの名無しさん
垢版 |
2017/07/30(日) 14:02:11.28ID:BhqS0uaq
見にくくてすみません。
インデント開けてるけど詰められてしまう。
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況