X



カプセル化■プライベートメソッドをテストする方法
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
垢版 |
2020/07/05(日) 20:47:46.60ID:M+BkbwUs
■短い回答
プライベートをテストしたい場合は設計に問題があるので、パブリックに変更してテストしましょう

■これに対する(変な人の)驚いた反論

プライベートを一時的にパブリックにして、テストが終わったら
プライベートに戻すなんてやるわけないだろw
↑誰もそんなコトしろなんて言ってない

■テスト専門家による回答

t-wadaのブログ
https://t-wada.hatenablog.jp/entry/should-we-test-private-methods

短くまとめると、プライベートなメソッドのテストを書く必要は 無い と考えています。

ほとんどのプライベートメソッドはパブリックメソッド経由でテストできるからです。
プライベートメソッドは実装の詳細であり、自動テストのターゲットとなる「外部から見た振る舞い」ではありません。
プライベートなメソッドのテストに関しては、4つの考え方があります。

・パブリックメソッド経由でテストする
・別クラスのパブリックメソッドとする
・テスト対象の可視性を(やや)上げる
・プライベートのまま、リフレクションでアクセスしてテストを書く

パブリックメソッド経由でテストする
多くの場合、そのクラスのパブリックメソッド経由でプライベートメソッドのテストも同時に行えます。テストできているか不安があるならテストカバレッジを確認しましょう。

別クラスのパブリックメソッドとする
プライベートなメソッドのテストを書きたいということは、実はテスト対象の責務が多すぎることを示唆している場合があります。
テストがどうしても書きたい場合は、その責務はテスト対象のプライベートな振る舞いではなく、他の誰かのパブリックな振る舞いなのでしょう。
0003デフォルトの名無しさん
垢版 |
2020/07/05(日) 20:51:53.15ID:M+BkbwUs
クソコード例。こんなコード書いてるやつが、privateのテストで
パブリックに変更してテストするのはおかしいとか言ってる(笑)
lenが配列(笑)理由 int型にはnullが入れられないから(笑)

https://mevius.5ch.net/test/read.cgi/tech/1592491656/805
ずれるかもしれないが下のような場合、privateにnullを突っ込んだらヌルポだが
privateをわざわざコード弄ってまで別にテストするようなことは少なくとも
ビジネスソフトでは知ってる限り無い。組み込みとかは知らんし必要ならやれば良いけど。

class ChinTester {
public void testChin(int[] len) {
if (len==null){System.out.println("You are a woman");
return;}
if (len.length<11){ uncS(len);}
else{funcB(len);}
return;}

private void funcS(int[] len){
if (len.length<9){System.out.println("Smallest");
}else{System.out.println("Smaller");}
return;}

private void funcB(int[] len){
if (len.length<14){System.out.println("Medium");}
else if (len.length<16){System.out.println("Bigger");
}else{ System.out.println("Wow!");}
return;}
}
0004デフォルトの名無しさん
垢版 |
2020/07/05(日) 20:53:33.00ID:M+BkbwUs
983 名前:デフォルトの名無しさん[] 投稿日:2020/07/05(日) 14:18:27.81 ID:9F15TCk0 [68/74]
正直あの短さでOOかどうかと(スタティックでインスタンス化もないコードだが)言うのは
不毛だけどID:JiRnWiGCの組み込みおじさんのがOO感はあるよ。

で、staticで出されてもprivateのテストがどうかと言う話には全く寄与しないわけだが、
じゃあ逆に、>>805のチンコテストのfuncSとfuncBはどうやってテストするの?

パブリック経由で全パターンと言うことならこれでこの話はおしまい。
パブリック経由でやりましょう。

違うと言うなら具体的にコードでおながいします。
0006デフォルトの名無しさん
垢版 |
2020/07/05(日) 20:57:49.33ID:M+BkbwUs
>>5の補足、これはまだプライベートですが
普通はMainクラスにコードをごちゃごちゃ書かないので
judgeLengthを含むクラスを作成します。

そしてmainから呼び出します。
必然的にjudgeLengthメソッドはパブリックになります。
0007デフォルトの名無しさん
垢版 |
2020/07/05(日) 21:03:41.24ID:MQ9nuMmc
>>6
judgeLengthをpublicにしてよいかどうか、オブジェクトをわけて良いかどうかは微妙なところで
publicにした場合って他のオブジェクトからも参照可能になってしまうので
そこの依存があとあとjudgeLengthの修正をできなくする可能性があるので
privateにするっていうのは他のオブジェクトから依存させないようにして独立させる意味もあるので
テストするためにpublicにしますっていうのは僕はやっぱり反対ですね
0008デフォルトの名無しさん
垢版 |
2020/07/05(日) 21:04:50.23ID:MQ9nuMmc
僕が書いたように同じオブジェクトにテストコードも書いちゃえば良いと思います
0009デフォルトの名無しさん
垢版 |
2020/07/05(日) 21:07:40.54ID:M+BkbwUs
>>7
微妙でもなんでもねーよ
Mainクラスに関係ない処理を入れるな

これは小さいサンプルだが、大きくなった時
Mainクラスに、そんな処理はいってたらおかしいだろ
なんで(大きくなったコードの)その他の部分は別のクラスにあるのに
この処理だけMainクラスにあるんだ?って
0010デフォルトの名無しさん
垢版 |
2020/07/05(日) 21:09:37.34ID:MQ9nuMmc
>>9
Mainクラスと関係ある処理だからMainクラスにあるんじゃよ
Mainクラスからしかアクセスしないからprivateなんじゃよ
テストするためにpublicにするのはおかしいのじゃよ
0011デフォルトの名無しさん
垢版 |
2020/07/05(日) 21:11:26.55ID:M+BkbwUs
>>10
Mainクラスと関係ある処理だから?

じゃあ名前が悪いよね。
誰が「Mainクラス」と聞いて
その中にある処理を想像できるんだ?w
0012デフォルトの名無しさん
垢版 |
2020/07/05(日) 21:13:00.77ID:MQ9nuMmc
>>11
えっと、前にも言ったけどpaizaはMainという名前じゃないと動かないんだよ
Mainとわけてクラスを作ることもできるけど面倒だからやらなかっただけ
普通のプログラマならpaizaの制約ぐらい知ってるだろうし説明する必要もないと思ってた
君の無知さを想像できなかった僕のミスだ
0013デフォルトの名無しさん
垢版 |
2020/07/05(日) 21:13:24.90ID:MQ9nuMmc
君が無知すぎてごめん
0014デフォルトの名無しさん
垢版 |
2020/07/05(日) 21:14:24.05ID:MQ9nuMmc
誠にごめんなさい
0015デフォルトの名無しさん
垢版 |
2020/07/05(日) 21:14:43.14ID:M+BkbwUs
>>12
だから分けろって。設計がおかしいだろ。

Mainクラスにメインの処理を入れるな
設計が悪いって言ってるのになんで理解できない?
0016デフォルトの名無しさん
垢版 |
2020/07/05(日) 21:15:37.89ID:M+BkbwUs
プライベートをテストしたいっていうのは
本質的に設計が悪いってことが理解できないやつ
もしくは設計なんてしたことがないやつなんだろう
0017デフォルトの名無しさん
垢版 |
2020/07/05(日) 21:15:45.13ID:MQ9nuMmc
>>15
てめえでやれやハゲ
0019デフォルトの名無しさん
垢版 |
2020/07/05(日) 21:17:00.58ID:MQ9nuMmc
>>16
君は簡単なロジックしか組む機会がなかった幸せな人だと思うよ
僕は君が羨ましい、幸せな人生を歩んでいるね
0020デフォルトの名無しさん
垢版 |
2020/07/05(日) 21:17:17.30ID:MQ9nuMmc
>>18
やってない君が不正解だね
0021デフォルトの名無しさん
垢版 |
2020/07/05(日) 21:19:16.27ID:MQ9nuMmc
僕は下痢便コードをこうするべきって修正したよ
paizaで動くようにMainというクラス名に変えたけどね
paizaだからそうなるよねってみんな理解してくれるものと思ってた
paizaを知らない木偶の坊がクラス名に文句つけてきたとき僕は絶望した
0022デフォルトの名無しさん
垢版 |
2020/07/05(日) 21:20:28.56ID:Xwol7cCi
まだやってたのかw
>>5みたいな下痢便コードが出てきた時点で
「あっ・・・(察し)」でスレ終了でしょ
0023デフォルトの名無しさん
垢版 |
2020/07/05(日) 21:21:29.14ID:MQ9nuMmc
こうするべきだと思うならやれば良いがな
自分でやりもせず他人に文句いうだけの人間は木偶の坊のそしりを免れないよ
0024デフォルトの名無しさん
垢版 |
2020/07/05(日) 21:22:53.14ID:M+BkbwUs
Mainに他のクラスの処理を全て同居させる

全部Mainにあるから呼び出せるよね?と
publicメソッドをprivateメソッドに変更

publicメソッドはMainのみ!
と言い

あぁ、プライベートメソッドのテストができない〜と嘆く(笑)

アホなのか?自分でテストできないようにクソ設計に変更して
自業自得じゃんw
002522
垢版 |
2020/07/05(日) 21:23:27.95ID:Xwol7cCi
×>>5みたいな下痢便コードが出てきた時点で
>>3みたいな下痢便コードが出てきた時点で

すまん訂正
0026デフォルトの名無しさん
垢版 |
2020/07/05(日) 21:25:43.01ID:MQ9nuMmc
>>24
君はまだMainという名前のレトリックから抜け出せてないように見える
paizaで動かすためにMainという名前にしたってだけだから
実際にはそれなりの名前になるでしょう
privateメソッドは当然クラスと関係あるものになるでしょうということ

Mainという名前に囚われ過ぎておられるように見受けられる
自分だったらこう書くのにって言うのがあるならそれを実践してみるべきかと思われます
0027デフォルトの名無しさん
垢版 |
2020/07/05(日) 21:25:44.19ID:M+BkbwUs
おそらく設計とは何かを知らずに、
ただ動けばいいと思ってるんだろう

テストしやすく設計するのも
設計の一つ
0028デフォルトの名無しさん
垢版 |
2020/07/05(日) 21:26:22.28ID:MQ9nuMmc
>>27
Mainを勘違いしてたアホが何抜かしとんねん
0031デフォルトの名無しさん
垢版 |
2020/07/05(日) 21:27:05.17ID:MQ9nuMmc
謙虚になれや
オブジェクト指向とは礼儀作法と心得よ
0032デフォルトの名無しさん
垢版 |
2020/07/05(日) 21:27:44.35ID:MQ9nuMmc
>>30
はいはいもうえーから
0033デフォルトの名無しさん
垢版 |
2020/07/05(日) 21:27:45.52ID:Xwol7cCi
>>27
Mainクラス云々については単に誤解してると思うけど
このスレの登場人物じゃあ多分おまいが一番マシな感性持ってそうやなw
0034デフォルトの名無しさん
垢版 |
2020/07/05(日) 21:28:41.91ID:MQ9nuMmc
>>29
作ってへんやんけ
0035デフォルトの名無しさん
垢版 |
2020/07/05(日) 21:28:59.67ID:MQ9nuMmc
やりもせずに何抜かしとんねん
0036デフォルトの名無しさん
垢版 |
2020/07/05(日) 21:29:55.13ID:MQ9nuMmc
ほんま口だけやな
0038デフォルトの名無しさん
垢版 |
2020/07/05(日) 22:53:15.98ID:VS9zJ3bZ
このスレの主旨的にはprivateメソッドのテストコードを書きたいんだよね?
書く必要がないって主張は違うよね?
0041デフォルトの名無しさん
垢版 |
2020/07/05(日) 23:27:01.94ID:cdjjBT1g
スレタイと書いてあることがチグハグで趣旨が解りづらいな。
スレタイに従えば、privateを呼び出したいみたいだが、>>1の発言を見るとprivateの呼び出しは推奨しないように見える。
まぁ、私も推奨しないけど。

という訳で、適当に独り言を語ってみる。

単体テストって、例えば...
Queueという名前のクラスがあって、そのクラスの中に
Enqueue、Dequeue、Peek、Clearメソッドが定義されていたら、それらメソッドを呼び出して、その結果を予想するコード(テストコード)を書いて実行させる方法がオブジェクト指向プログラマーにとって一般的だと思うけど...その際にprivateメソッド(内部実装)をテストコードから呼び出さないといけない理由がわからん。
0042デフォルトの名無しさん
垢版 |
2020/07/05(日) 23:28:17.41ID:LRfXHt7v
t-wadaさんがどういう人か調べてみたところ、日本が誇るJavascript使いなんだな。
すると、t-wadaさんの立場ではprivateをテストしないというのは全くもって正しいと思う。
privateでやる事はライブラリを呼び出すだけなので、テストするのは無駄。

しかし、他の言語ではアルゴリズムの実装という仕事があり、アルゴリズムの実装をテストしたいという要求は常に存在する。
0043デフォルトの名無しさん
垢版 |
2020/07/05(日) 23:48:39.22ID:LRfXHt7v
例えば多くのパーサーは公開メンバとしてpush()を持つ。
文字をプッシュする関数だ。
めぼしい公開メンバはこの程度しかない。

しかしその裏に100を超える非公開のメンバがあっても驚かない。
非決定性のパーサはその程度のメンバを持つ。

文字をプッシュする公開メンバ一つで、多くの状態、多くのメンバをテストするのは面倒な話で、何方にせよ非公開のメンバ、非公開の状態変数について知識が無ければテストできない。
だったら内部の状態について一切テストしないか、内部の状態を直接テストするか二択となる。

内部の状態についてはブラックボックスとして扱うべきと述べているのがt-wadaさんだが、それでは実装が非常に困難だ。
0044デフォルトの名無しさん
垢版 |
2020/07/05(日) 23:55:21.34ID:LRfXHt7v
パーサーの話ついでに、もう一つアイデアを提供しよう。
決定性パーサーでは、還元が行われたとき、外部に影響を及ぼす。
通常この時点で意味動作を行う。
t-wadaさんは、この時に限りテストを行うべきであり、それ以外でテストを行ってはいけないと述べる。

つまり、シフトが行われるときはテストしてはならない。
今どの状態にあるかは外部にかかわりのない事なのでテストとしてはならない。
入力文字として改行を与えるとどの状態に遷移するかテストしてはならない。

これは厳しすぎやしないだろうか?
0045デフォルトの名無しさん
垢版 |
2020/07/06(月) 00:01:34.67ID:NTI0gQuc
詳細を知ってはならないということは、どの状態を経てその記号が生み出されたのか知ってはならないということであり、これは非常につらい。
0046デフォルトの名無しさん
垢版 |
2020/07/06(月) 00:03:58.43ID:NTI0gQuc
システム利用者がシステム作者に「詳細を検査しちゃだめじゃないか!」と怒っているように見える。
0048デフォルトの名無しさん
垢版 |
2020/07/06(月) 00:27:13.73ID:NTI0gQuc
クリスマスプレゼントが何かを知るために箱を振って音を聞くよりも、箱を開けて直接見るほうが早い。
0049デフォルトの名無しさん
垢版 |
2020/07/06(月) 00:29:02.17ID:NTI0gQuc
箱を振って「プレゼントはプリキュア」と観測できたとする。
これは果たしてどの程度もっともらしいだろうか?
0050デフォルトの名無しさん
垢版 |
2020/07/06(月) 01:18:51.21ID:gvRhXNla
privateなメソッドの動きが仕様書で定義されてたらテストしなくちゃいけないし書いてなかったら書く必要無い
そしてprivateなメソッドの仕様まで定めた仕様書は俺は見たことない
0053デフォルトの名無しさん
垢版 |
2020/07/06(月) 07:37:12.27ID:ODctk1XU
>>50
仕様書には普通アクセス修飾子を何にするかなんて書かないからね
設計書にもそんな細かいこと書かないでしょ
0054デフォルトの名無しさん
垢版 |
2020/07/06(月) 07:38:08.27ID:cDMo9043
書いてない関数を勝手に作るなんて禁止に決まってるだろ
テストのためだけに関数は作らない
0056デフォルトの名無しさん
垢版 |
2020/07/06(月) 08:00:23.42ID:ODctk1XU
関数を作るのに許可がいるなんてすごいことだからとてもすごいと思いました
0057デフォルトの名無しさん
垢版 |
2020/07/06(月) 09:07:12.86ID:aZiq8mUC
>>1にはテストとしか書かれていないけど、記事元はユニットテスト(単体テスト)の話だよね?
0061デフォルトの名無しさん
垢版 |
2020/07/06(月) 12:27:52.10ID:aZiq8mUC
>>59
自分であたかも他のテストがあるように言っておいて変な話だがだが、しないね。

単体テストで不具合を見つけた後、デバッガを使って更にどこにバグの原因が潜んでいるのか分析することはあるけど、それはもはやテストではなくデバッグだしね。
0062デフォルトの名無しさん
垢版 |
2020/07/06(月) 12:34:18.82ID:aZiq8mUC
てかさ、タイトルがカプセル化なのに、なんで>>3>>5もテストコード実行場所とテストコード実行場所が同じ階層に記述されているのさ。
0063デフォルトの名無しさん
垢版 |
2020/07/06(月) 12:35:06.14ID:aZiq8mUC
ミス。テストコード実行場所とテスト対象が同じ階層に書かれているのはなんで?だ。
0064デフォルトの名無しさん
垢版 |
2020/07/06(月) 14:43:00.46ID:NTI0gQuc
和田理論は穴が多くてお話にならないな。
0066デフォルトの名無しさん
垢版 |
2020/07/06(月) 14:51:45.46ID:NTI0gQuc
和田理論に騙された人は抗議したほうが良い。
0067デフォルトの名無しさん
垢版 |
2020/07/06(月) 14:54:43.27ID:EsDpeV3E
wadaは忘れろ

privateだからテストしなくていいなどという都合のいい法則は存在しない だがprivateだからとテストをしないキチガイは確実に存在するのだ
0068デフォルトの名無しさん
垢版 |
2020/07/06(月) 15:05:56.82ID:NTI0gQuc
和田理論被害者の会ひつよう。
とてもひつよう。
0069デフォルトの名無しさん
垢版 |
2020/07/06(月) 15:07:12.95ID:bo8iccWD
一意見を急に”理論”とか”法則”とか言う方が頭どうかしてるよ

t-wadaはTDDをわかりやすく解説することに定評があるだけ
ただいろんな会社からテストのコンサルティングで雇われる程度には有能だから
君たちの意見よりは一般には受け入れられやすい
0070デフォルトの名無しさん
垢版 |
2020/07/06(月) 15:10:07.70ID:NTI0gQuc
和田理論被害者の会ニューヨーク支部もひつよう。
とてもひつよう。
0072デフォルトの名無しさん
垢版 |
2020/07/06(月) 15:14:01.90ID:NTI0gQuc
前スレで王家秘伝のレシピ教えたのに。
誰も活用しないんだな。
0073デフォルトの名無しさん
垢版 |
2020/07/06(月) 15:17:52.38ID:NTI0gQuc
俺も活用していないわそういえば。
0074デフォルトの名無しさん
垢版 |
2020/07/06(月) 15:18:30.87ID:9+hHOd2F
>>61
> 単体テストで不具合を見つけた後、デバッガを使って更にどこにバグの原因が潜んでいるのか分析することはあるけど、それはもはやテストではなくデバッグだしね。

単体テストで不具合を見つけた後にするもの=デバッグ
デバッグの前にする不具合を見るけるもの=テスト

だろ?

テストの後にするデバッグは、テストではなくデバッグだしねって
あんた何言ってるの?
0075デフォルトの名無しさん
垢版 |
2020/07/06(月) 16:05:37.75ID:n2uckING
オブジェクト指向の話をしよう

彡ミ
↓↓↓
彡 ⌒ ミ
(´・ω・`) 頭皮、毛髪に触れるものは全て検査する
0076デフォルトの名無しさん
垢版 |
2020/07/06(月) 17:22:23.35ID:aZiq8mUC
>>74
そんな細かいこと気にすんなよ。揚げ足取りめ。
よく単体テストは不具合を見つけるためにやると言われるが、別視点の考え方もあるって話だ。

ここでは些細な話だったな。
0077デフォルトの名無しさん
垢版 |
2020/07/06(月) 17:32:36.88ID:zkbL7M3i
>>74
> テストの後にするデバッグは、テストではなくデバッグだしねって
> あんた何言ってるの?

テストの後にするデバッグはデバッグでしかないと思いますけど、どこに突っ込みを入れたいのですか?
0080デフォルトの名無しさん
垢版 |
2020/07/06(月) 22:24:42.23ID:djm9krVS
まだプログラミング教室やってんのかw
0082デフォルトの名無しさん
垢版 |
2020/07/07(火) 11:33:22.19ID:hnvy2tUT
もしかすると、バグの原因を調査する作業はテストに含まれるかどうかって話かな?
0083デフォルトの名無しさん
垢版 |
2020/07/07(火) 11:34:20.85ID:zTLocdwC
和田メソッド被害者の会に入れてほしいです。
0084デフォルトの名無しさん
垢版 |
2020/07/07(火) 11:40:38.80ID:YBf2Aagc
>>81
当たり前だろ?
テストではなくデバッグだしねっていうのが意味わからんって言ってる
テストはテストだろ
0085デフォルトの名無しさん
垢版 |
2020/07/07(火) 12:01:27.16ID:hnvy2tUT
突っ込みどころねーじゃんw
それなのに喧嘩腰で突っ込んで周囲に突っ込まれただけか。
0087デフォルトの名無しさん
垢版 |
2020/07/07(火) 12:25:55.22ID:NlNPNtxk
privateのチェックって具体的にどうやるの?
Queueというクラスをテストするケースを例に教えて。
0088デフォルトの名無しさん
垢版 |
2020/07/07(火) 12:31:21.40ID:jam8vymb
queue = Queue()
queue.push(17)
asserEqual( queue.length, 1)
a = queue.pop()
assertEqual( a, 17)
assertEqual( quele.length, 0)

だいたいこんなもんだろ。
0089デフォルトの名無しさん
垢版 |
2020/07/07(火) 12:37:00.92ID:NlNPNtxk
>>88
おお、俺もそんなのイメージしてた。
そんなコードでpublic経由でprivateを呼び、ついでにカバレッジテストとか済ませる感じかな。

...だったらいいのだが、なーんか、このスレの人達の言動を見ていると怪しいんだよな。
88は別に問題ないけど。
0090デフォルトの名無しさん
垢版 |
2020/07/07(火) 12:56:17.65ID:NlNPNtxk
カバレッジテストをするかどうかは、ケースバイケース。どちらでもいいとして、一番気にしているのは、そもそも>>1の記事主に批判的な人はオブジェクト指向を理解しているのか?という点。
怪しいというのは、そこね。
0091デフォルトの名無しさん
垢版 |
2020/07/07(火) 13:10:52.54ID:YBf2Aagc
>>85
デバッグはテストじゃなくてデバッグだしねと言われても当たり前としか言えないし、
デバッグの前にやるテストはテストだしねで終わりだろ?
0092デフォルトの名無しさん
垢版 |
2020/07/07(火) 13:14:04.43ID:zTLocdwC
>>91
言いたいことは何となく理解できる。
「私以外はみんな馬鹿」
ってことだろ?

つまりキミの主な言語はJava。
0093デフォルトの名無しさん
垢版 |
2020/07/07(火) 13:19:42.71ID:zTLocdwC
どうやら図星だったようですね。

Javaではありがちなんですよ。
0094デフォルトの名無しさん
垢版 |
2020/07/07(火) 13:28:08.57ID:RJk/Rw+W
>>91
とまぁ、>>92みたいな低能が蔓延るスレで世間の常識は通用しないってことが証明されちゃったわけだ。
立ち去るがいい。
0096デフォルトの名無しさん
垢版 |
2020/07/07(火) 14:34:40.27ID:zTLocdwC
>>95
Java!Java!
0097デフォルトの名無しさん
垢版 |
2020/07/07(火) 14:48:31.09ID:zTLocdwC
>>95
馬鹿にしてない。
馬鹿に付ける薬はない。
0098デフォルトの名無しさん
垢版 |
2020/07/07(火) 14:56:56.51ID:zTLocdwC
オブジェクト指向はダメなんじゃないか?というのが前スレの趣旨で、非公開のメンバは何のためにあるの?テストどうするの?という話になった。

それに対する回答が「非公開のメンバはブラックボックスとして扱いテストしてはならない」という和田メソッドが示された。

それに対して「入力に使われる一つのメンバしかもたないパーサ」という実例を挙げ、「文字列を入力され構文木を返すような状態機械のテストが非常に困難」という話が出た。
この場合、内部を観測できないのであれば、すべての入力の組み合わせ(受理できない入力もテストするなら、それは無限である)に対して、すべての取りうる構文木のセットを検査しなければならない。
つまりそれは太陽系よりもはるかに広く、銀河の向こうまでテストするということである。

それに対して「オブジェクト指向を知らない」などと抜けたことを言うので、「Java!」という結論が出された。
0099デフォルトの名無しさん
垢版 |
2020/07/07(火) 15:04:16.80ID:YBf2Aagc
> それに対する回答が「非公開のメンバはブラックボックスとして扱いテストしてはならない」という和田メソッドが示された。

正確には

・パブリックメソッド経由でテストする
・別クラスのパブリックメソッドとする
・テスト対象の可視性を(やや)上げる
・プライベートのまま、リフレクションでアクセスしてテストを書く

まとめ
繰り返すと、プライベートなメソッドや関数をテストする必要は無いと考えています。
プライベートなメソッドは、実装の詳細であるからです。
0100デフォルトの名無しさん
垢版 |
2020/07/07(火) 15:05:58.19ID:O+C/kGAG
実装の詳細ならむしろテストが必要だと思うのだけど
なんで詳細だからテストしなくて良いのだろう
t_wada被害者の会に僕も入会させてください
0101デフォルトの名無しさん
垢版 |
2020/07/07(火) 15:07:05.23ID:zTLocdwC
>>99
公開メンバは文字を入力するpush()のみと示されてるだろ。
複数の文字を入力して構文木を得る、ごくありふれた状態機械の話だよ。

公開メンバは一つしかない。

ほらテストしてみろ。
0102デフォルトの名無しさん
垢版 |
2020/07/07(火) 15:07:48.37ID:YBf2Aagc
>>98
> それに対して「入力に使われる一つのメンバしかもたないパーサ」という実例を挙げ、「文字列を入力され構文木を返すような状態機械のテストが非常に困難」という話が出た。
> この場合、内部を観測できないのであれば、すべての入力の組み合わせ(受理できない入力もテストするなら、それは無限である)に対して、すべての取りうる構文木のセットを検査しなければならない。

それはパブリックメソッドでも同じこと
内部を観測して、すべての入力の組み合わせをテストしないといけないから
0103デフォルトの名無しさん
垢版 |
2020/07/07(火) 15:08:26.27ID:YBf2Aagc
>>101
> ほらテストしてみろ。

テストしてもいいが、先にパブリックメソッドの場合の例を書いてくれ
それと同じことをやればいいだけなんだが
0104デフォルトの名無しさん
垢版 |
2020/07/07(火) 15:10:39.95ID:O+C/kGAG
単体テストっていう言い方がまずいのかも
インターフェーステストとインプリメンテーションテストに分けるのが良い気がします
0105デフォルトの名無しさん
垢版 |
2020/07/07(火) 15:11:55.03ID:zTLocdwC
言い張るんだったら、ほんとに和田メソッド被害者の会作っちゃうよ?
会員200万人目指しちゃうよ?
いいの?
0107デフォルトの名無しさん
垢版 |
2020/07/07(火) 15:12:43.34ID:zTLocdwC
>>105
言いたいことわかってくれるあなたは、PythonとかC#とかC++ですね?
0108デフォルトの名無しさん
垢版 |
2020/07/07(火) 15:13:07.34ID:YBf2Aagc
自作自演w

105 名前:デフォルトの名無しさん[] 投稿日:2020/07/07(火) 15:11:55.03 ID:zTLocdwC [8/9]
言い張るんだったら、ほんとに和田メソッド被害者の会作っちゃうよ?
会員200万人目指しちゃうよ?
いいの?


107 名前:デフォルトの名無しさん[] 投稿日:2020/07/07(火) 15:12:43.34 ID:zTLocdwC [9/9]
>>105
言いたいことわかってくれるあなたは、PythonとかC#とかC++ですね?
0109デフォルトの名無しさん
垢版 |
2020/07/07(火) 15:13:54.75ID:O+C/kGAG
王家の秘伝メソッド普及委員会を立ち上げよう
0110デフォルトの名無しさん
垢版 |
2020/07/07(火) 15:14:08.44ID:zTLocdwC
>>108
>>104 に言いたかっただけだろ。
そのくらいわかれ。
0111デフォルトの名無しさん
垢版 |
2020/07/07(火) 15:15:25.23ID:YBf2Aagc
>>110
そんなどうでもいいものばっかりにレスしてないで、
先にパブリックメソッドの場合に
どうするかを答えてくれないか?
0112デフォルトの名無しさん
垢版 |
2020/07/07(火) 15:15:52.28ID:zTLocdwC
Javaは色々研究して提唱してえらいなあと思う部分もあるんだけど、すぐに宗教化してしまうからな。
そこがJava!なんだよな。
0113デフォルトの名無しさん
垢版 |
2020/07/07(火) 15:17:07.58ID:YBf2Aagc
どうも都合が悪かったようだな
俺のレスに答えられずひたすら関係ない話を始めた
0115デフォルトの名無しさん
垢版 |
2020/07/07(火) 15:20:13.83ID:zTLocdwC
でも俺が設立するからには、普通じゃダメなんだよ。
俺がやるからには、和田メソッド被害者の会長が和田さん。
ここまでやってこそ本物だと思うんだよね。
まず、和田さんを説き伏せなきゃ。
0116デフォルトの名無しさん
垢版 |
2020/07/07(火) 15:21:24.14ID:YBf2Aagc
いいだしっぺが説き伏せるそうです。
実際に行動を起こせるか見てみましょう
0117デフォルトの名無しさん
垢版 |
2020/07/07(火) 15:22:05.58ID:zTLocdwC
和田さん頼むわ。
見てるんやろ?
0118デフォルトの名無しさん
垢版 |
2020/07/07(火) 15:22:43.01ID:YBf2Aagc
いきなり他人だよりです(笑)
自分から知らせに行く勇気もないようですね
0119デフォルトの名無しさん
垢版 |
2020/07/07(火) 15:24:58.29ID:zTLocdwC
>>104 をベースに考察していけば良いのでは。
0120デフォルトの名無しさん
垢版 |
2020/07/07(火) 15:26:46.74ID:YBf2Aagc
ではまずいいだしっぺから
なぜパブリックメソッドにすると
すべての入力の組み合わせをテストしなくてよくなるのか?
C1カバレッジって言葉知ってますかね?
0123デフォルトの名無しさん
垢版 |
2020/07/07(火) 15:39:26.39ID:K/dtFkkl
>>87
一般的にはQueueはprivateのメソッドも単純なロジックしか持たないから
public経由のテストで十分な場合が多いかもしれないけど
それがあらゆる状況に当てはまるわけではない

例えばgrowableなring bufferでqueueを実装するとして
バッファを拡大させるロジックに独自の最適化をいろいろと施してるような場合、
各種分岐に応じたメモリコピーの方法だったり、それに応じたメモリの初期化状態の確認だったり
privateなhead/tailポインタへのアクセスだったり、
public経由だけでは確認できないテストをしたほうがいい場合がある
0124デフォルトの名無しさん
垢版 |
2020/07/07(火) 15:42:28.40ID:YBf2Aagc
>>123
訂正

一般的にはQueueはprivateのメソッドも単純なロジックしか持たないから
public経由のテストで十分な場合が多いかもしれないけど
それがあらゆる状況に当てはまるわけではない

もしpublic経由のテストで不十分な場合、それはメソッドの責務が大きいと考えられる
リファクタリングして複数のクラスに分離するのが正しい対応
そうすれば自然publicメソッドとなりテストが可能になる
0125デフォルトの名無しさん
垢版 |
2020/07/07(火) 15:53:43.14ID:zTLocdwC
キミも和田メソッドの被害者なんだよ。
可哀そうに。
和田さん本人だとしても、被害者であることに変わりはないんだよ。
0127デフォルトの名無しさん
垢版 |
2020/07/07(火) 16:00:23.93ID:zTLocdwC
もう和田さんは改心してこっちの味方だから。
0130デフォルトの名無しさん
垢版 |
2020/07/07(火) 16:15:15.28ID:zTLocdwC
和田メソッド被害者の会、会員募集中。
和田さんも入会して良いんだヨ。
0131デフォルトの名無しさん
垢版 |
2020/07/07(火) 17:39:48.25ID:O+C/kGAG
>>123
君は信頼できる
実装をよくわかってる人だ
013394
垢版 |
2020/07/07(火) 17:55:40.01ID:k9dX6gDH
>>95
今さらだけど、前スレのタイトル(今より酷い)から察せると思うが、あなたの想像を越えるお馬鹿さんがいるから、常識を持つあなたはここから逃げた方がいいよと、お前どっちの味方だよ風に言いたかった。
0134デフォルトの名無しさん
垢版 |
2020/07/07(火) 18:13:36.60ID:k9dX6gDH
って、何でもないです。
(アンカが自分に向いていたと勘違いしてたとか言えねぇ)
0139デフォルトの名無しさん
垢版 |
2020/07/07(火) 19:27:35.46ID:zm6NAQZG
オブジェクト指向を理解している人間の言うprivateをテストせよ/テストするべきではない と、 オブジェクト指向を理解していない人間のprivateをテストせよ/テストするべきでない は論争のレベルが全然違う。
大学生同士の論争と小学生同士の喧嘩くらい違う。

お前はどっちだ?>>138
0141デフォルトの名無しさん
垢版 |
2020/07/07(火) 19:32:38.84ID:bdixmHft
ここで話を整理するけど

privateメソッドだからテストしないとか言ってるやつはキチガイ
早く死んでね
0143デフォルトの名無しさん
垢版 |
2020/07/07(火) 19:35:50.42ID:bdixmHft
うんうん

わかってない人もいるみたいだからもう一度ここで仕切り直しさせてほしい



privateメソッドだからテストしないとか言ってるやつはキチガイ
早く死んでね



わかったかな?
0145デフォルトの名無しさん
垢版 |
2020/07/07(火) 19:37:40.45ID:rZMsiuSb
頭皮に触れるものは全て検査する

彡ミ
↓↓↓
彡 ⌒ ミ
(´・ω・`) 使ってるシャンプー、肌に合ってるかい?
0147デフォルトの名無しさん
垢版 |
2020/07/07(火) 22:01:24.32ID:YBf2Aagc
>>143
> privateメソッドだからテストしないとか言ってるやつはキチガイ
だれそれ?

privateメソッドはpublicメソッド経由でテストすると
言ってる人しかいないけど?
0149デフォルトの名無しさん
垢版 |
2020/07/07(火) 22:11:43.28ID:bdixmHft
>>147
それテストできてねーからw
publicから t=0のときだけprivateの処理が欲しかったとするじゃん?
そのままじゃpublicは仕様でt=0のときしかそのprivateメソッドを呼ばないんだから
そのpublicからしかテストしないんじゃt≠0のときのテストできねーじゃん
やんねーのかよ?
ある時改修で別のpublicメソッドからt=3のときにprivateメソッドを呼ぶことになったらt=0しかテストやってなかったら
普通は怒り狂うもんだよ
っていうか絶対ブッ殺す
0150デフォルトの名無しさん
垢版 |
2020/07/07(火) 22:27:58.06ID:YBf2Aagc
>>149

> そのままじゃpublicは仕様でt=0のときしかそのprivateメソッドを呼ばないんだから

つまり、publicがt=0のときprivateメソッドを呼ぶんですよね?
publicがt=0のテストをすれば、privateのテストしてるじゃないですかw
0151デフォルトの名無しさん
垢版 |
2020/07/07(火) 22:30:06.58ID:YBf2Aagc
> ある時改修で別のpublicメソッドからt=3のときにprivateメソッドを呼ぶことになったら
> t=0しかテストやってなかったら

仕様が変わったのならt=3のときのテストを追加しましょう
0152デフォルトの名無しさん
垢版 |
2020/07/07(火) 22:34:14.99ID:YBf2Aagc
>>149はホント意味不明だな

最初の仕様・・・t=0のときしかprivateメソッドの処理をしない
t=3のときは?→「privateメソッドの処理をしない」場合の結果が正しい

改修・・・t=3のときにprivateメソッドの処理をすることになった
「privateメソッドの処理をした」場合の結果が以前と異なるという仕様になった
では新しい仕様のテストを書きましょう

これだけなんだがなぁ
前と正しい答えが違うのに、テストを修正しないの?
0153デフォルトの名無しさん
垢版 |
2020/07/07(火) 22:49:42.87ID:bdixmHft
>>151
おかしくない?
privateメソッドの仕様は変わってないよ

お前はガラクタをこさえたから説明のできない行動を取らなければならない
0154デフォルトの名無しさん
垢版 |
2020/07/07(火) 22:52:36.96ID:bdixmHft
設計書かコメントに

このメソッドはt=0のときしかテストしていません!

って書いてあるの?
お前のソースって
悪いけど見たことねーや
滅茶苦茶バカだしもういいかな?
レスしなくて
0155デフォルトの名無しさん
垢版 |
2020/07/07(火) 22:54:46.63ID:YBf2Aagc
>>153
だから変わったpublicメソッドをテストしろよ
変わってないならprivateメソッドに何の問題もないだろ
それとも何か?お前すべての取りうる値でテストしろと言ってんのか?


この関数は数値を二倍してくれる関数である。
今まで4を入れてこの関数を呼び出していた。

今度5を入れるようになったから5を入れた場合はどうなるかテストする必要がある
今度は6を、7を、8を・・・って新しい引数で呼び出すために
そのテストが必要なんか?ああん?
0156デフォルトの名無しさん
垢版 |
2020/07/07(火) 22:56:07.20ID:YBf2Aagc
>>154
> このメソッドはt=0のときしかテストしていません!

お前は t=全ての整数 でテストしろっていってるってことでいい?
0158デフォルトの名無しさん
垢版 |
2020/07/07(火) 23:02:33.64ID:bdixmHft
だが、お前のやり方ではどうやっても通すことはできないんだよ
こんな簡単なテストすら不可能
早く死ねよ
これがお前の限界なんだよ
0159デフォルトの名無しさん
垢版 |
2020/07/07(火) 23:06:04.37ID:bdixmHft
っていうかここまで自分の間違いを認めない意味はなんかあるの?
これぜってー仕事でお前の主張が通る現場ねーぞガチで
メソッドにt=0のときしかテストしてませんって書いてあるもの納品するか?
ナメてんじゃねーよ
0160デフォルトの名無しさん
垢版 |
2020/07/07(火) 23:36:58.56ID:YBf2Aagc
>>157
> は?最小-1、最小、中間、最大、最大+1通すだろフツー

・t=3のどこが、最小-1、最小、中間、最大、最大+1なんだよw

「今回」新しく仕様が変わって、t=3 などというものが登場したんだろ
なら「今回」テストを追加するだけの話だろ

それとも何か? t=3がいままでprivateを呼ばなかったのに
t=3のテストをお前はするんか?どういった理由で?
0161デフォルトの名無しさん
垢版 |
2020/07/07(火) 23:47:24.20ID:zm6NAQZG
>>159

> っていうかここまで自分の間違いを認めない意味はなんかあるの?

お前のことだろ。

> これぜってー仕事でお前の主張が通る現場ねーぞガチで

お前のことだろ。
0162デフォルトの名無しさん
垢版 |
2020/07/07(火) 23:56:35.16ID:D1qF8R0D
bdixmHftはQueueという言葉とオブジェクト指向という言葉が理解できずに発狂した説
0163デフォルトの名無しさん
垢版 |
2020/07/08(水) 00:21:47.63ID:SznGehK7
詳細に関する知識が無ければ検査できないなら、公開メンバを介して検査するのと、非公開メンバを直接検査するのは同じことですよ。

これが理解できないなら、もはや議論の意味が無いでしょう。

そもそも自身が推奨する和田メソッドさえ理解できていないって事ですから。
0164デフォルトの名無しさん
垢版 |
2020/07/08(水) 00:28:23.66ID:SznGehK7
アンクルボブの理論に対する賛否両論から議論を始めるべきなのかもしれない。
0165デフォルトの名無しさん
垢版 |
2020/07/08(水) 00:29:51.46ID:kqVG+rMe
>>149

そもそも、public経由のテストで網羅できないレベルのprivateメソッドなんてクラス内部に定義するなゴミ。
別クラスに分けろ。
0166デフォルトの名無しさん
垢版 |
2020/07/08(水) 00:35:35.13ID:SznGehK7
和田さんはアンクルボブを理論のベースにしています。
和田理論否定派はアンクルボブ理論を理解したうえで和田理論に異議を述べています。
和田理論信仰者は、そもそもアンクルボブって何?状態です。

だから議論が成り立っていないのです。
0168デフォルトの名無しさん
垢版 |
2020/07/08(水) 00:52:01.29ID:SznGehK7
詳細に関する知識を持ってはならないというのが和田理論の根幹です。

private、publicという字面にこだわるのは単なる信仰心にすぎません。
神を信じますか?ハイ信じます。
神を見ましたか?ハイ見ました。
こういうことです。
0169デフォルトの名無しさん
垢版 |
2020/07/08(水) 00:56:34.00ID:SznGehK7
和田理論を素直に受け入れられるのは、プログラミングとはAPIを呼び出すことであり、決してアルゴリズムを実装することではないからですよ。

つまり、システム利用者がシステム作者に対して小言を言うような状態です。
詳細を検査したら駄目じゃないか!詳細は呼び出せればいいんだよ!
0171デフォルトの名無しさん
垢版 |
2020/07/08(水) 01:28:51.37ID:/rdq0ZOx
「和田理論」も同じな。「アンチ和田」はなにか理由があって
命名しているんだろう。常識的なことを名前をつけることで
特別な方法だと錯覚させる手かな?
0176デフォルトの名無しさん
垢版 |
2020/07/08(水) 08:29:40.77ID:6ZEX1zcL
アンクルボブをロバートと読み替えても通じますし
僕が納得したところでお前は何も困りません
0177デフォルトの名無しさん
垢版 |
2020/07/08(水) 08:35:30.95ID:6ZEX1zcL
>>159
相手は >>3 の下痢便コード書いた人だよ
まともなプログラム書けない人だから相手にするだけ無駄だよ
0178デフォルトの名無しさん
垢版 |
2020/07/08(水) 09:02:50.79ID:SznGehK7
>>172
ハイそうです。
0179デフォルトの名無しさん
垢版 |
2020/07/08(水) 12:16:39.34ID:hmU+YLWt
関数が取りうる値で全てでテストしろと言ってるアホがいるスレはここですか?

今回78という値で関数を呼び出すことになった
78という値を与えた時、ちゃんと動くかテストしているかね?

だってさ(笑)
0180デフォルトの名無しさん
垢版 |
2020/07/08(水) 12:42:10.97ID:PWwZYnOX
privateメソッドのテストを具体的にどうやるのか未だに分からん。

そもそも、public経由のメソッド呼び出しで網羅できない巨大privateメソッドの正しい動作なんて定義できるの?
0181デフォルトの名無しさん
垢版 |
2020/07/08(水) 12:54:49.19ID:ODFOiaSP
巨大なメソッド自体が悪じゃね

あとテストってinoutを確認するんじゃないの?
outいっぱいしてたらもうそれ完全害悪じゃね
0182デフォルトの名無しさん
垢版 |
2020/07/08(水) 14:27:45.18ID:ZL+NZ9CQ
ステートメントの入力により無限通りの構文木が出力されるパーサ?
なんだそれ?
0183デフォルトの名無しさん
垢版 |
2020/07/08(水) 17:57:24.33ID:pS2ORJtj
>>179
最小、最大、中間値ぐらいしか言ってないのにそうやって曲解しないと負けちゃいそうなの?
0184デフォルトの名無しさん
垢版 |
2020/07/08(水) 18:33:36.38ID:IWyzFdDn
そもそも、privateメソッドを定義すること事態、滅多にないよ。
というか、自分のソース見たら無かった。
0185デフォルトの名無しさん
垢版 |
2020/07/08(水) 18:42:33.47ID:IWyzFdDn
このスレの過去の発言を見ると誤解を招きそうだから補足するけど、別に内部処理をpublicにしたからprivateは無いという意味じゃないからね?
元からpublicメソッドとprivate変数しかない。
0186デフォルトの名無しさん
垢版 |
2020/07/08(水) 20:52:09.28ID:Sbr5rKl2
>>181
巨大なメソッドをprivateメソッドに分割しても、その分割したメソッドを個別にテストできなけりゃ
分割してないのと同じじゃね?
0187デフォルトの名無しさん
垢版 |
2020/07/08(水) 20:55:55.79ID:hmU+YLWt
>>183
↓って書いてますが? 3と78でなにか違いがあるんですか?

> ある時改修で別のpublicメソッドからt=3のときにprivateメソッドを呼ぶことになったら
> t=0しかテストやってなかったら
0188デフォルトの名無しさん
垢版 |
2020/07/08(水) 20:59:13.73ID:hmU+YLWt
>>186
そういうこと。巨大なメソッドがあったらそれを
一つのメソッドと、そこから使われるユーティリティメソッドに分割する
ユーティリティメソッドはできる限り汎用的なインターフェスにする(たとえ一箇所でしか使われていなくても)
ユーティリティメソッドはそれ単体でテストする
そうすれば巨大なメソッドのコード量が減る
0189デフォルトの名無しさん
垢版 |
2020/07/08(水) 21:15:04.90ID:s5mehW61
>>187
そここだわってるのお前だけじゃん
最小、最大、中間値のテストやった?
って聞かれてるときに3でも78でも駄目なのはバカでもわかるだろ?w
0190デフォルトの名無しさん
垢版 |
2020/07/08(水) 21:19:38.42ID:hmU+YLWt
>>189
あのさぁ、ごまかしてないでちゃんと書こうよ?

最小、最大、中間値のテストやってれば
最小、最大、中間値ではない3のテストなんて不要なんだよって
ちゃんといわないと、あのバカには伝わらないよ?
0191デフォルトの名無しさん
垢版 |
2020/07/08(水) 23:59:05.09ID:hEQaHqpN
最小、最大、中間値って聞いたことがないけど
どこかの分野で一般的に使われてるもの?

境界値分析なら
境界値と境界値の内側と外側の3値か
境界値と境界値の外側の2値かどっちかが一般的だと思う
0195デフォルトの名無しさん
垢版 |
2020/07/10(金) 12:24:37.85ID:sSLzYC6I
詳細を知ってはならないということは、詳細の知識、つまり境界を知ってはならないということ。

「彼らはオブジェクト指向を全く知らない可哀そうな人ではないか?Javaを学ぶべきだ!」などと言う前に、原典に当たろう。
0197デフォルトの名無しさん
垢版 |
2020/07/10(金) 12:54:55.71ID:1UxRpBTq
zTLocdwC以外、Javaなんて誰も言ってないけど?何が言いたいんだ?

スレタイはカプセル化って書いてあるしOOPは理解している前提でしょ?
まぁ、明らかにOOPを理解していない人が発狂していたけど。
0198デフォルトの名無しさん
垢版 |
2020/07/10(金) 14:04:44.56ID:sSLzYC6I
いや、おそらくわかっていないだろう。
0199デフォルトの名無しさん
垢版 |
2020/07/10(金) 14:09:26.25ID:sSLzYC6I
オブジェクト指向のすばらしさを語っている人が、一番オブジェクト指向を知らない。
ゆえに議論が成り立たないという状態ではないだろか。
0200デフォルトの名無しさん
垢版 |
2020/07/10(金) 14:12:09.99ID:sSLzYC6I
>>196
隠ぺいとオブジェクト指向は直行する概念ではある。
とはいえ、事実上同時に用いられるので、関係ないとは言えないのではないか。
0201デフォルトの名無しさん
垢版 |
2020/07/10(金) 15:02:20.85ID:zQa5K81u
>>200
そもそも、このスレで誰もオブジェクト指向の素晴らしさなんて語っていない。

さっきから誰に対して言ってるんだ...。
0203デフォルトの名無しさん
垢版 |
2020/07/10(金) 16:07:13.59ID:sSLzYC6I
和田メソッドを称賛してる人たちに決まってるだろ。
0205デフォルトの名無しさん
垢版 |
2020/07/10(金) 17:14:49.72ID:sSLzYC6I
>>1 に書いてあるだろ。
0207デフォルトの名無しさん
垢版 |
2020/07/10(金) 20:12:23.39ID:FovnwiSG
常識を疑え、それって和田メソッドじゃないかって
0208デフォルトの名無しさん
垢版 |
2020/07/10(金) 20:49:58.98ID:zQa5K81u
常識じゃん。むしろ、常識を疑うその心を疑え。それって経験不足では?

まぁ、強いて言うのなら、リフレクションを用いてテストは、許してはならない反則行為だと思うがな。
特に、カバレッジテストとかする場合は。
0209デフォルトの名無しさん
垢版 |
2020/07/10(金) 21:00:54.86ID:zQa5K81u
ただ、記事を書いた和田さん?も、記事を読むとその危険性を理解しているみたいだから対立する気はないよ。
黒魔術と言ってるし。

なんで黒魔術なんでしょうねぇ(すっとぼけ)
0210デフォルトの名無しさん
垢版 |
2020/07/10(金) 21:09:49.17ID:HmvrAlYz
そりゃC++への嫉妬だろ
C++はそう呼ばれるのに、Javaは何故かそうは呼ばれない、それは何故か?
Javaに欠けているものとは一体……?!
0211デフォルトの名無しさん
垢版 |
2020/07/10(金) 21:30:17.43ID:LiH0PaR7
黒魔術って言われ方を誉め言葉だと思ってる馬鹿ってほんとにいるんだな。。
0212デフォルトの名無しさん
垢版 |
2020/07/10(金) 21:36:39.85ID:pLXOeUja
オブジェクトが隠蔽・カプセル化するものだからといってホワイトボックステストまで否定しちゃうのは変な話。
0213デフォルトの名無しさん
垢版 |
2020/07/10(金) 21:51:04.37ID:zQa5K81u
ホワイトボックステストを否定する気はないけど...例えば
>>88のコードを借りるけど

> queue = Queue()
> queue.push(17)
> asserEqual( queue.length, 1)
> a = queue.pop()
> assertEqual( a, 17)
> assertEqual( quele.length, 0)

こんなノリでprivateだったメソッドをpublicにしたり、リフレクションを使って呼び出すとする。

queue.内部実装()

...で、これでカバレッジテストに合格しちゃったらどうするの?

Queueというクラスはテストに合格したと見なすの?
テストってテスト項目に合否判定を出す作業だと思うのだが、内部実装の呼び出しで合否判定を変えるなんてチートは駄目だと思う。

そもそも、privateメソッドを定義するケース自体、珍しいから、経験則に基づかない発言でもあるが...。
0214デフォルトの名無しさん
垢版 |
2020/07/10(金) 21:56:59.04ID:FovnwiSG
和田メソッドは非常識
0215デフォルトの名無しさん
垢版 |
2020/07/10(金) 22:02:19.60ID:FovnwiSG
和田さんはQueueを実装したことない素人
0216デフォルトの名無しさん
垢版 |
2020/07/10(金) 22:04:28.86ID:zQa5K81u
あー...うん、俺の言い方が悪かったかも。
privateメソッドをテストするというレアケースだから許してくれ。
常識が無い以上、もっと正確に細かく伝えるべきだったな。

ただ、俺の主張(リフレクションは反則
行為)の弱い点を言うと、OOPやDDDの概念を無視した設計には、こちらの主張は当てはまらない。
そう思うと、和田さんのリフレクションをギリギリ許容(?)するような記事の書き方も否定はできん。

なんだかんだで、彼の記事は自分が記事を書くよりは無難にまとめられているとは思う。
まぁ、記事を書いたことないけど。
0217デフォルトの名無しさん
垢版 |
2020/07/10(金) 22:09:19.05ID:pPoV7F8C
ユーザーが直接public methodを使うわけじゃなければ
public methodだって実装の詳細

integration test経由で
必要なpublic methodはテストできるんだから
個別にすべてのpublic methodをテストする必要なんてない

というのと似たようなもの
それでいい場合もあればそうじゃない場合もあるというだけ
0218デフォルトの名無しさん
垢版 |
2020/07/10(金) 22:23:15.71ID:FovnwiSG
まあね、処理の複雑さによるのだろうね
hello world程度ならテストさえ必要ないだろうし
0219デフォルトの名無しさん
垢版 |
2020/07/10(金) 22:31:36.66ID:pLXOeUja
>>213
どうするの?っていうそこの何が問題なのかわからん。
必要以上の詳細をテストしてしまうことによってテストが壊れやすくなるという
一般的な話以上のものではないように思うが。
0220デフォルトの名無しさん
垢版 |
2020/07/10(金) 22:38:32.51ID:d7aQvYi7
そこで、テスト駆動開発ですよ。
最初にテストケースを定義してそれをパスする
コードを書けばpublicだのprivateだの議論は不要

だれかこの開発方法やってる?
0221デフォルトの名無しさん
垢版 |
2020/07/10(金) 22:54:55.64ID:FovnwiSG
>>220
privateだとテストケース書けないじゃん
0222デフォルトの名無しさん
垢版 |
2020/07/10(金) 23:26:01.49ID:zQa5K81u
>>219
不合格になるはずのテストに合格してしまうのが問題なんだよ。

>>220
テスト駆動開発は社内でも聞いたことがあるけど、実践はしてない。
まぁ、自分自身、詳細は知らない。後で調べるか。
0223デフォルトの名無しさん
垢版 |
2020/07/11(土) 00:18:29.78ID:E2OZ8LYK
>>213
> ...で、これでカバレッジテストに合格しちゃったらどうするの?

テストはテストコードを見ないで
OKってでたからOKだ
ってやるもんじゃないよ


テストコードはレビューするものだ
通ったからOKじゃなくて、通るのは当たり前で
テストコードを見て正しくテストされてることを確認する

テスト結果のOKが「エビデンス」なのではなくテストコードが「エビデンス」
動作してることを証明するスクリーンショット(笑)と同じもの
「エビデンス」は見て確認しなければいけない
0224デフォルトの名無しさん
垢版 |
2020/07/11(土) 00:21:18.34ID:E2OZ8LYK
>>221
テストケースがあるもの=publicメソッドで
privateは中で必要に応じて作るもの
メソッドにしてもいいしメソッドにしなくてもいい

テストケース書けないなら関数にせずにそのまま埋め込めよ
publicメソッドのテストケースが問題ないなら
中の詳細なテストなんかいらんだろ
メソッドにしてないかもしれないし
0226デフォルトの名無しさん
垢版 |
2020/07/11(土) 00:40:55.17ID:JFnadz6+
何度でもだ!
0227デフォルトの名無しさん
垢版 |
2020/07/11(土) 00:42:45.65ID:JFnadz6+
>>224
テストケースが書けないってだけでインライン展開するんすか?
構造化プログラミングを愚弄する狼藉っすよ
遠山の金さんの桜吹雪を拝むことになりますよ
0228デフォルトの名無しさん
垢版 |
2020/07/11(土) 00:43:07.74ID:JFnadz6+
遠山の和田さん
0229デフォルトの名無しさん
垢版 |
2020/07/11(土) 00:45:42.66ID:JFnadz6+
privateではなくてパッケージプライベートにした方がええのかもわからんね
0231デフォルトの名無しさん
垢版 |
2020/07/11(土) 01:01:26.38ID:E2OZ8LYK
>>227
テストケースが書けるならばpublicにすればいいだろ?
テストケースがある=仕様が明確になってる証拠
0234デフォルトの名無しさん
垢版 |
2020/07/11(土) 02:18:29.03ID:wIsoNFzM
privateでかっこいいメソッドなんだろうがよ!

いや、俺実はpublic staticしか作らんけど
0235デフォルトの名無しさん
垢版 |
2020/07/11(土) 02:41:27.63ID:P8l8Ig/I
>>222
正直、開発自体をテスト工藤開発で終えるのはキツいと思うけど、
コーディング→動作確認→デバッグ→リファクタリングの
プログラマー個人の短いサイクルでのトライ&エラーには結構使えるんじゃないかと思う。

カバレッジ100%のテストケースは作る工数とメンテが大変だからそこまでする必要はないと思うけど、
そこそこのカバレッジでプログラマーが個人で高速に開発を回せるのは強い。

カバレッジ100%目指すのは単体テストの時だけで十分
0237デフォルトの名無しさん
垢版 |
2020/07/11(土) 06:05:52.59ID:KCR4lRFo
t-wada氏の推奨する和田メソッド。
0238デフォルトの名無しさん
垢版 |
2020/07/11(土) 06:15:18.08ID:KCR4lRFo
和田メソッドによると「非公開メンバをテストすると品質が下がるので絶対するな!」
0240デフォルトの名無しさん
垢版 |
2020/07/11(土) 07:51:10.03ID:KCR4lRFo
意識が高くなりすぎて幽体離脱した感のある和田メソッドをよろしく!
0241デフォルトの名無しさん
垢版 |
2020/07/11(土) 07:55:47.65ID:Cl4N6Aux
>>22
いや、その「不合格になるはず」のところがわからん。
呼べないはずの内部実装が呼べちゃったってこと?
0242デフォルトの名無しさん
垢版 |
2020/07/11(土) 09:06:32.32ID:JaL6gziv
>>241
合否判定が変わる例ってこんな感じじゃない?
不当に不合格になる例

queue = Queue()
queue.push(17)
asserEqual( queue.length, 1)
a = queue.pop()

queue.内部実装()

assertEqual( a, 17) ←不合格
assertEqual( quele.length, 0)

※ユーザーが呼べるメソッドを呼んだら、なんか破綻したケース

あるいは網羅テストをやってて、不当に合格する例
for(i = 0 ; i<127;i++){
queue.内部実装(i)
}

内部処理{
switch(条件)
以下略
}

条件分岐を全て網羅したから合格。
はおかしい。
queue.pushやpopの呼び出しで合格できなかった網羅テストを内部実装を直接呼び出して合格って変な話。

という意味では?
0244デフォルトの名無しさん
垢版 |
2020/07/11(土) 09:26:28.69ID:Cl4N6Aux
>>242
いや、ますますわからん。
そのタイミングで内部実装()呼んでもaの値は変わらんと思うが?

pop()の前に呼ぶんだとしたらなんでそんなテストを書くんだという話になるし。
異なる操作をしたならassert条件が変わるのは当たり前。
0245デフォルトの名無しさん
垢版 |
2020/07/11(土) 09:35:57.08ID:JaL6gziv
>>244
前者は私のミス

>>243
ごめん、カバレッジやったことないから間違っていたら謝る

うーん、この解釈を間違えた感
0246デフォルトの名無しさん
垢版 |
2020/07/11(土) 09:55:21.63ID:fJlL8BSP
>>242
まずテストの考え方が違うんだよ。

全ての組み合わせをテストする完全な網羅テストは時間的に不可能
その他のテストも数によっては現実的に不可能となることが多い
通常カバレッジ100%というのは命令網羅テストにすぎない
だが命令網羅テストをやってれば完璧かと言うかそうではない

じゃあどれをやればいいんだよ!?と思うかもしれないが、どれをやるかじゃない
何をやれば自分が作ったものが正しく動くと自信が持てるかなんだよ
現実的に実現可能であるというルールを加えれば、完璧なテストなんてできやしない。

内部実装を直接呼び出して合格したとしても、
それで正しく動くと自信が持てるなら、それで全然かまわないんだよ。
ただしテストする以上、内部実装の仕様を明確にしなきゃテストのレビューはできなくなる。
内部実装の仕様が明確になったならpublicにして問題ない。

おまけだが、pubicメソッドのテストでもprivateメソッドのテストでも
カバレッジを計測するなら、それはホワイトボックステストだからな
なんか間違ってる人がいるようだから
0247デフォルトの名無しさん
垢版 |
2020/07/11(土) 09:55:24.65ID:0/l6dmQ+
結局クラス分けするなりしてpublicにする部分を多くする、
テストと使用する局面で可視性を変える
の二つしかないわけで、プログラム機能でどうこうする話じゃない。
使う奴が理解して使うという話以上にはならん。
0248デフォルトの名無しさん
垢版 |
2020/07/11(土) 10:23:35.92ID:Cl4N6Aux
「privateメソッドがテストできないんですがどうしたらいいですか?」という疑問に対して、
なんとかしてテストする方法を編み出すのではなく「privateメソッドはテストしなくていい!」という
逆転の発想というかバッサリ感が中二受けしたんだと思う。
0251デフォルトの名無しさん
垢版 |
2020/07/11(土) 10:53:54.57ID:Cl4N6Aux
だって可視性とテストするしないの関係は自明じゃないじゃん。
それが関係あるなら外部にexportする関数以外はテストしなくていいことになるんじゃね?
0252デフォルトの名無しさん
垢版 |
2020/07/11(土) 11:13:39.51ID:JFnadz6+
>>231
教えてしんぜよう
アクセス修飾子は仕様が明確になってることを表すものではないからだ
0253デフォルトの名無しさん
垢版 |
2020/07/11(土) 11:16:43.36ID:JFnadz6+
publicにしたら全然関係ないパッケージからもアクセスされてしまうからね
不必要な依存を発生させることになってしまう、密結合が促進されるね
そういう意識のない人間が >>3 のような下痢便コードを書いてしまうんだね
0254デフォルトの名無しさん
垢版 |
2020/07/11(土) 11:18:39.33ID:fJlL8BSP
>>252
アクセス修飾子は仕様が明確になってることを表すなんて言ってないよ
仕様が明確になってるならpublicでいいと言ってるだけ
0255デフォルトの名無しさん
垢版 |
2020/07/11(土) 11:19:08.47ID:fJlL8BSP
>>253
> publicにしたら全然関係ないパッケージからもアクセスされてしまうからね

全然関係ないパッケージ = テストコード
アクセスできてなにか問題あるの?
0256デフォルトの名無しさん
垢版 |
2020/07/11(土) 11:20:35.92ID:JFnadz6+
>>254
言ってるじゃん、アクセス修飾子とメソッドの仕様が明確になってるかは無関係
0257デフォルトの名無しさん
垢版 |
2020/07/11(土) 11:21:19.03ID:JFnadz6+
>>255
何いってんのお前
テストは同じパッケージにするのが基本だろ
テストしたこと無いの?
0258デフォルトの名無しさん
垢版 |
2020/07/11(土) 11:22:19.30ID:JFnadz6+
テストから呼び出せるのが問題なんじゃなくて
関係ないパッケージから呼び出されて密結合になるのが問題だと言ってる
0259デフォルトの名無しさん
垢版 |
2020/07/11(土) 11:22:42.09ID:JFnadz6+
だからパッケージプライベートなら良いだろうと言ってるわけ
0260デフォルトの名無しさん
垢版 |
2020/07/11(土) 11:25:32.87ID:fJlL8BSP
>>256
言ってないよ?

外部からアクセスしないならprivate。
でも仕様がはっきりしてるならpublicにしていい。

facebookでもプライベートな話は他人に見せる必要がないからprivateだけど
別に他人に見せてもいいならpublicにしてもいいよね
それと一緒
0261デフォルトの名無しさん
垢版 |
2020/07/11(土) 11:26:14.03ID:JFnadz6+
パッケージプライベートだと同じパッケージからならアクセスして良いというメッセージを
開発者に伝えてしまうから望まない依存を生んでしまうリスクはある
どのオブジェクトからも参照されたくない場合もあるからな、やはりprivateをテストできない
言語が遅れてるだけなのだろうね
0262デフォルトの名無しさん
垢版 |
2020/07/11(土) 11:26:21.59ID:fJlL8BSP
>>257
> テストは同じパッケージにするのが基本だろ

Java以外で、同じパッケージとはなんのことで
そうするとどうなるんですか?
0263デフォルトの名無しさん
垢版 |
2020/07/11(土) 11:27:14.70ID:JFnadz6+
>>260
外部からアクセスしないけれども仕様がはっきりしてるからpublicにするのはありえないってことですよ
なぜならば密結合になってしまうから
0264デフォルトの名無しさん
垢版 |
2020/07/11(土) 11:27:56.48ID:fJlL8BSP
>>261
privateをテストできる言語っていうのは
単に全てpublicになっているのと一緒

アンダースコアで、これはアクセスできるけど
privateという意味ですよと言ってるのと何も変わらないよ
0265デフォルトの名無しさん
垢版 |
2020/07/11(土) 11:28:00.37ID:JFnadz6+
>>262
Javaの話ですよ
0266デフォルトの名無しさん
垢版 |
2020/07/11(土) 11:28:48.86ID:JFnadz6+
>>264
アンダースコア?
そうなの? 全部の言語がそんな仕様なの?
それは知らなかったなー
0267デフォルトの名無しさん
垢版 |
2020/07/11(土) 11:29:55.28ID:fJlL8BSP
>>263
仕様がはっきりしてるからpublicにするんじゃなくて
仕様をはっきりさせれば、publicにしてもよいと言ってるだけ
理由がなければprivateのままでもいい。どちらでもいい。
テストしたい=理由。理由があるならpublicにしていい。

> なぜならば密結合になってしまうから
テストコードから仕様がはっきりしないprivateをテストすること=密結合
密結合を避けるためにも、公開されたインターフェースにするのが正しい
0268デフォルトの名無しさん
垢版 |
2020/07/11(土) 11:30:13.81ID:JFnadz6+
RustやGoはprivateもテストできるよって言ってる人いたから
最近の言語ではprivateもテストできるんだーって思ってたけど
命名規則でアクセス修飾子の代わりを果たしてるんだってことだったの? それは知らなかったなー
0271デフォルトの名無しさん
垢版 |
2020/07/11(土) 11:31:27.48ID:JFnadz6+
>>267
仕様がはっきりしててもpublicにしてはいけないからprivateなんだよ
テストが依存することを密結合とは言わないよ
0272デフォルトの名無しさん
垢版 |
2020/07/11(土) 11:31:51.16ID:JFnadz6+
>>269
知らないよ

>>270
そうだよ
0273デフォルトの名無しさん
垢版 |
2020/07/11(土) 11:32:06.66ID:fJlL8BSP
privateにあくせすできる言語でも
テストするならどちらにしろ仕様をはっきりさせないといけない

そうしないとテストコードがあったからといって
これが正しく仕様を満たしているのか?なんてわからない
0274デフォルトの名無しさん
垢版 |
2020/07/11(土) 11:35:07.08ID:JFnadz6+
さすがです >>3 の下痢便コード書くだけありますね
何言ってるのかさっぱりわからない
0275デフォルトの名無しさん
垢版 |
2020/07/11(土) 11:36:54.90ID:fJlL8BSP
>>3のコードを書いたのは別の人。

そもそも>>3のコードをクソコードと言って
このスレにコピペしたのが俺
0276デフォルトの名無しさん
垢版 |
2020/07/11(土) 11:38:14.80ID:JFnadz6+
>>275
そうすると君はMainを勘違いしてた人か、僕と仲直りしますか?
0277デフォルトの名無しさん
垢版 |
2020/07/11(土) 11:39:33.67ID:JFnadz6+
同じ人が同じこと言ってるだけのスレ
でもそんなスレも良いですよね
0278デフォルトの名無しさん
垢版 |
2020/07/11(土) 11:47:13.10ID:JFnadz6+
たとえばこの先Javaが進化したとしてテストオブジェクトのみを特別視して
テストオブジェクトからのみprivateにアクセスできるようになったとすると
テストオブジェクトをオブジェクト指向の枠組みで捉えるならば
オブジェクト指向としては破綻してる

Javaは受け入れないだろうね、Microsoftがdelegateを提案したときも
interfaceという仕組みがあるんだからdelegateは邪道だと言って蹴ったからなあ

実益に叶うという理由で根本的なところまで作り変えることができるのは
Microsoftだろうなあ、Javaの前にC#が対応しそうな予感はある
0279デフォルトの名無しさん
垢版 |
2020/07/11(土) 11:52:27.04ID:JFnadz6+
いまの言語仕様での最適解は >>5 ですね
これ書いた人は天才だと思いますよ
何気ないことだけれどもコードの隅々にまで神経が行き届いていて
美しく整備されて堅牢なコードです、オブジェクト指向の限界を示したと言って良いですね
0281デフォルトの名無しさん
垢版 |
2020/07/11(土) 12:00:30.64ID:Cl4N6Aux
テストコードは設計の外にあるものだからクラスの可視性とか直接関係ないだろ。
ふつう、設計書のクラス図にテストクラスを書いたりはしない。
0283デフォルトの名無しさん
垢版 |
2020/07/11(土) 12:06:30.88ID:JFnadz6+
>>281
そうなんだよねー
0285デフォルトの名無しさん
垢版 |
2020/07/11(土) 12:11:12.25ID:JFnadz6+
クラス内を調査してprivateメソッドを列挙して
同クラス内のprivateメソッドをテストするコードを列挙して
カバレッジを計測するツールがあればみんな幸せになれそうですね

カバレッジ計測ツールがprivateメソッドには今の時点で対応してないって
だけでprivateメソッドのテスト自体は >>5 のように書けますから
ツールの開発が遅れてるだけなのかも知れませんね
0286デフォルトの名無しさん
垢版 |
2020/07/11(土) 12:12:35.29ID:fJlL8BSP
>>285
もしかしてお前カバレッジの意味がわかってないんじゃね?

publicメソッドの中からprivateメソッドが呼び出された時
privateメソッドの行は実行された=カバレッジとして計測される

ってことは知ってますよね?
0287デフォルトの名無しさん
垢版 |
2020/07/11(土) 12:15:06.18ID:fJlL8BSP
世の中にある全てのカバレッジ計測ツールは
privateメソッド内の実行した行を測定できるのですが
>>285を見る限り何もわかってない気がしますねw
0288デフォルトの名無しさん
垢版 |
2020/07/11(土) 12:15:29.92ID:JFnadz6+
>>286
僕は単体テストやったこと無い
カバレッジの計測もしたことないからわからない
僕は知りません
0290デフォルトの名無しさん
垢版 |
2020/07/11(土) 12:17:45.08ID:JFnadz6+
>>289
それにはちょっと異論があるんだけれども、今回は僕が折れましょう
僕と仲直りしますか?
0291デフォルトの名無しさん
垢版 |
2020/07/11(土) 12:18:51.24ID:fJlL8BSP
>>290
でもおまえ単体テストしたこと無いし
カバレッジの計測もしたことがないから
何も理解してないじゃん(笑)
問題はそこだよね。
0293デフォルトの名無しさん
垢版 |
2020/07/11(土) 12:19:47.24ID:JFnadz6+
>>291
問題はそこじゃないです、君は僕と仲直りますかということが問題です
0294デフォルトの名無しさん
垢版 |
2020/07/11(土) 12:22:20.99ID:JFnadz6+
僕はいままで手作業による結合テストだけで生き抜いてきた生粋のブラックボックスマンです
なぜそれが可能だったかというと簡単なプログラムしか書いたことがなかったからです
しかし、最近複雑なプログラムを書く機会があり結合テストだけでは不十分であることを実感しました
以上、僕の近況報告です
0295デフォルトの名無しさん
垢版 |
2020/07/11(土) 12:23:49.29ID:JFnadz6+
僕は単体テスト書いたことありますよ >>5 で書きました
カバレッジは計測したことないですけどそれは重要ではありません
0297デフォルトの名無しさん
垢版 |
2020/07/11(土) 12:27:47.72ID:fJlL8BSP
>>292
最終的な設計ドキュメントはコードから生成するものだからね
クラス図にprivateメソッドが書かれていて嬉しいのでしょうかどうなのでしょうか?
0298デフォルトの名無しさん
垢版 |
2020/07/11(土) 12:28:33.49ID:fJlL8BSP
> 最終的な設計ドキュメントはコードから生成するものだからね
クラス図の話ね。クラス図は(唯一?)コードから生成できる。
0299デフォルトの名無しさん
垢版 |
2020/07/11(土) 12:29:05.33ID:JFnadz6+
>>296
(´・ω・`)
0300デフォルトの名無しさん
垢版 |
2020/07/11(土) 12:31:00.81ID:fJlL8BSP
正直、詳細なクラス図は、設計図の中で一番不要だと思ってる。
必要なのはソースコードと完全に一致してるクラス図ではなく
クラス概要図・関連図とでも言うべきだろう

主要なメソッドとそれぞれのクラス関係がわかればいい
目的はなにかを考えればその結論にたどり着くはず
0302デフォルトの名無しさん
垢版 |
2020/07/11(土) 12:45:10.61ID:JFnadz6+
単体テストという言葉の曖昧さがpublic派か、private派かの分裂の原因です

publicメソッドはオブジェクトのインターフェイスなので
publicメソッドをテストすることをインターフェイステストというべきです
オブジェクト指向で、インターフェイスが関わるのはオブジェクトのコラボレーションが行われるときです

一方でprivateメソッドはpublicメソッドが作られるのと同じか、もしくはそれ以前に作られます
publicメソッドが正しく動作することの前提としてprivateメソッドが正しく動作することがあるので
privateメソッドをテストすることをインプリメンテーションテストという言うべきです
privateメソッドを使用するのは同じオブジェクト内のメソッドなので、オブジェクトのコラボレーションとは直接の関係がありません

単体テストと言っても対象のメソッドによって、テストが必要な時期が異なるわけです
privateのテストはクラスが作られる前に行われますし、publicのテストがクラスは作られた後に行われます

あとはコストの話です、結合テストがすべて通るなら単体テストは必要ありませんし本番稼働がすべてうまくいくならテスト自体必要ありません
後の工程で発覚するほど手戻りが大きくなりコストが膨らむので段階を追ってテストしていきましょうというのが基本的な考え方です

privateのテストをすることによってpublicのテストの手戻りが少なくなることはあるんです
privateのテストはやったほうが良いです。
0303デフォルトの名無しさん
垢版 |
2020/07/11(土) 12:45:36.89ID:fJlL8BSP
>>301
保守する時はコードから生成できるので完璧なのはいらない
だから本当に必要なのはクラス概要図だろう

図としてみたい場合、メソッドすべてがずらずら書かれていても邪魔なだけ
ましてやprivateなんていらない。
図としてみたい場合、本当に見たいのは関連だろう?
0304デフォルトの名無しさん
垢版 |
2020/07/11(土) 12:46:11.05ID:fJlL8BSP
>>302
> 単体テストという言葉の曖昧さが

それ以前に、おまえ単体テストしたこと無いし
カバレッジの計測もしたことがないから
何も理解してないじゃん(笑)
問題はそこだよね。
0305デフォルトの名無しさん
垢版 |
2020/07/11(土) 12:46:51.38ID:JFnadz6+
頑張って書いた、これはもう論文と言って良いのでは
僕はプログラミングのテストについて博士号もらっても良いのでは
少なくともこのスレではテストに一番詳しい
0306デフォルトの名無しさん
垢版 |
2020/07/11(土) 12:48:09.47ID:JFnadz6+
>>304
僕は >>5 で単体テスト書きましたよ
君はカバレッジ計測ツールを使用して理解した気になってるだけのアホです
0307デフォルトの名無しさん
垢版 |
2020/07/11(土) 12:48:53.15ID:JFnadz6+
僕はツールを使ったことはないけど、頭を使うからね
0308デフォルトの名無しさん
垢版 |
2020/07/11(土) 12:50:19.54ID:fJlL8BSP
288 返信:デフォルトの名無しさん[] 投稿日:2020/07/11(土) 12:15:29.92 ID:JFnadz6+ [26/35]
>>286
僕は単体テストやったこと無い
カバレッジの計測もしたことないからわからない
僕は知りません
0309デフォルトの名無しさん
垢版 |
2020/07/11(土) 12:51:19.09ID:JFnadz6+
>>308
>>5 では書きましたよ
0310デフォルトの名無しさん
垢版 |
2020/07/11(土) 12:53:21.76ID:JFnadz6+
君はレトリックな部分に引きづられる傾向があるから
もう少し客観的に遠目でものを見るようにしたが良いかも
0311デフォルトの名無しさん
垢版 |
2020/07/11(土) 13:02:59.95ID:JFnadz6+
僕はJavaしか知らないと言ったけどC#に関するあっと言わせるような知識と考察を垣間見せたでしょ
僕の知性あふれる想像力は君の経験を凌駕する
ツールに習熟して使いこなすのも大事だけど、頭を使って状況を分析して打開する力も大事
僕は後者の方が優れている、君と僕が手を組めば最強になれる
僕と仲直りしてくれますか?
0312デフォルトの名無しさん
垢版 |
2020/07/11(土) 14:58:15.05ID:0BF0aQZE
TDD信奉者がprivateメソッドのテストは必要ないと主張するのは当たり前

TDDは一般的にpublicメソッドを最小”ユニット”として書き始めるから
privateメソッドが作られるのはテストが通る状態を維持したままリファクタリングして
一部をprivateメソッドに抽出した場合だけ
だからprivateメソッドのテストを書く必要がない

privateメソッドじゃなくHelperクラスのpublicメソッド等に抽出した場合も同じ
HelperクラスをpublicなAPIとして公開するのでなければ別途テストを追加する必要は基本的にない
0313デフォルトの名無しさん
垢版 |
2020/07/11(土) 15:11:26.01ID:KCR4lRFo
和田メソッドよろしく!
0314デフォルトの名無しさん
垢版 |
2020/07/11(土) 15:36:11.13ID:JFnadz6+
>>312
なるほどね
0315デフォルトの名無しさん
垢版 |
2020/07/11(土) 15:55:06.50ID:fJlL8BSP
和田さんの話にも飽きたので、レガシーコード改善ガイドという本の話でもしようか?
https://bmf-tech.com/posts/%E3%83%AC%E3%82%AC%E3%82%B7%E3%83%BC%E3%82%B3%E3%83%BC%E3%83%89%E6%94%B9%E5%96%84%E3%82%AC%E3%82%A4%E3%83%89

・クラスのメソッドがprivateだったとき
  ・publicメソッドを通じたテストが可能か検討する
    ・publicメソッドを通じたテストを行うことで実際のコードと同じ方法によるテストが保証できる
  ・上記が可能でない場合
    ・そのprivateメソッドはpublicにすべき
      ・大抵の場合はそのクラスが多くのことをやりすぎている、再設計が必要であることを意味している
・privateメソッドをpublicメソッドにすることについて悩む点
  ・メソッドが単なるユーティリティで、呼び出し側が気にかけるものでない
    →そのメソッドを別クラスに移せないか検討する
    →クラスのインターフェースに余分なpublicメソッドがあることは許容可能
  ・呼び出し側がそのメソッドを直接使った場合、そのクラスの他のメソッドの結果に悪影響を及ぼす可能性がある
    →そのメソッドを別クラスに移し、移動先のクラスでpublicにする
・良い設計とはテストが可能であり、悪い設計はテストが不可能

まあ言ってることはほとんど同じなんだけどなw
0316デフォルトの名無しさん
垢版 |
2020/07/11(土) 15:56:52.92ID:fJlL8BSP
https://maku.blog/p/p6awy3z/#%E7%AC%AC10%E7%AB%A0-%E3%81%93%E3%81%AE%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%82%92%E3%83%86%E3%82%B9%E3%83%88%E3%83%8F%E3%83%BC%E3%83%8D%E3%82%B9%E3%81%A7%E5%8B%95%E3%81%8B%E3%81%99%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%9B%E3%82%93

第10章 このメソッドをテストハーネスで動かすことができません

テストしたいメソッドが private である
・private メソッドをテストしたい場合、そのメソッドは public にすべきである。
・public メソッドにすべきかどうかで悩んでしまう場合、大抵は、そのクラスが多くのことを行いすぎであり、
修正すべきことを意味している(1つのクラスが複数の責務を持ってしまっている)。
・よい設計はテスト可能であり、テスト可能でない設計は悪い設計である。


・この方法は、メソッドを単純に public 化するのと本質的には変わらないので微妙な対応方法だが、リファクタリングすべき箇所の目印となる。
・Java などの言語ではリフレクションによって private メソッドのテストを記述することはできるが、
根本的な依存関係の問題を先延ばしにしているだけである。その種のごまかしをすると、
コードがどの程度悪くなっているのかに気付きにくくなってしまう。
0317デフォルトの名無しさん
垢版 |
2020/07/11(土) 17:36:03.50ID:KCR4lRFo
北朝鮮行ったことあるか?

日本の町並みには看板があるだろ?
「パナソニック」とか「コカ・コーラ」とかだよな。

北朝鮮でこれに該当するのはスローガンの看板だから。
社名や商品名の看板は一切ない。
「ウリナラをキノコの国にしよう!」←裏の意味は無くそのままの意味らしい。
「苦難の行軍!」
「白頭の革命精神!」

和田メソッドに通じるものがあるよな。
0318デフォルトの名無しさん
垢版 |
2020/07/11(土) 18:36:13.70ID:fJlL8BSP
>>317

他のスレで書いたけど「例え」は物事をわかりやすく説明するために使うもの
何かを批判するために「例え」を使うのは悪手。なぜなら
「例え」で批判してるのは「例え」に使ったものだから

お前が批判してるのは北朝鮮であって
和田さんや「レガシーコード改善ガイド」の
ベストプラクティスの批判にはなっていない
0319デフォルトの名無しさん
垢版 |
2020/07/11(土) 18:45:30.42ID:KCR4lRFo
和田メソッドは時代遅れの遺物。
0320デフォルトの名無しさん
垢版 |
2020/07/11(土) 18:47:40.49ID:KCR4lRFo
t-wada氏がお勧めする和田メソッド。
0321デフォルトの名無しさん
垢版 |
2020/07/11(土) 19:20:51.26ID:JFnadz6+
話をしようかと言い、本の内容をコピペしただけとかゲンナリするよね
たとえ批判されても自分が言ったわけじゃないから問題ないわけですね
スネ夫メソッドと名付けましょう
0322デフォルトの名無しさん
垢版 |
2020/07/11(土) 19:23:09.88ID:JFnadz6+
本に書いてあることを自分なりに実践してみた結果大失敗して
和田メソッドは役に立たなかったとかそういう話が聞きたい
0324デフォルトの名無しさん
垢版 |
2020/07/11(土) 19:35:57.71ID:JFnadz6+
>>323
さようか
0325デフォルトの名無しさん
垢版 |
2020/07/11(土) 19:37:32.93ID:JFnadz6+
車の運転がうまい人は車の危険性を知ってる人
和田メソッドを熟知した人なら和田メソッドの危険性を知ってると思うのだよ
和田メソッドの限界はどこにあるのだろうね
TDDが向かないプログラムもあるとは本に書いてあるけど
それが具体的にどういう状況か、どういうプログラムかは示されないからよくわからない
僕はTDDの限界はpublicを前提とするところにあるのじゃないかと漠然と思ってる
まだぼんやりとして言語化できる段階にない
0326デフォルトの名無しさん
垢版 |
2020/07/11(土) 20:23:20.20ID:JFnadz6+
ググってみたけどTDDに否定的な考え方は世界的にあるみたいね
0327デフォルトの名無しさん
垢版 |
2020/07/11(土) 20:58:34.53ID:KCR4lRFo
TDDはともかく、和田メソッドはダメでしょう。
0328デフォルトの名無しさん
垢版 |
2020/07/11(土) 21:57:47.69ID:fJlL8BSP
まるで○○は危険でしょうと言うだけで
何が危険かわかってない人のような言い方だなw
0329デフォルトの名無しさん
垢版 |
2020/07/11(土) 21:59:07.66ID:fJlL8BSP
>>325
> まだぼんやりとして言語化できる段階にない

当たり前


288 返信:デフォルトの名無しさん[] 投稿日:2020/07/11(土) 12:15:29.92 ID:JFnadz6+ [26/44]
>>286
僕は単体テストやったこと無い
カバレッジの計測もしたことないからわからない
僕は知りません
0330デフォルトの名無しさん
垢版 |
2020/07/11(土) 22:03:47.24ID:fJlL8BSP
>>327
ではTDDの場合どうなのか?

Private Methods, Test Driven Development, and Good Design
https://www.infoq.com/news/2008/01/private-methods-tdd-design/

> Why to test private method? Most of TDDers would answer instantly: don’t do it.
プライベートのテストをする理由?
ほとんどのTDDersはこう答える。「するな」

和田メソッド(笑)が言っていることとTDDは完全に一致してるな
まあ実際にはTDDが最初にあって和田さんは
それに同意して、TDDの話をしてるんだから当然なんだが
0333デフォルトの名無しさん
垢版 |
2020/07/11(土) 22:28:49.46ID:JFnadz6+
>>329
僕は頭を使うことによって君の経験はすでに超越してるよ
君はただツールを使ったことがあるってだけのただのアホ
0334デフォルトの名無しさん
垢版 |
2020/07/11(土) 22:31:24.19ID:JFnadz6+
> 実践した結果コードがきれいになり
> テストがしやすくなったよ

君の感想はこれだけ
あとは引用コピペを繰り返してるだけ
君の経験は浅すぎて僕の参考にならない
0335デフォルトの名無しさん
垢版 |
2020/07/11(土) 22:32:08.86ID:JFnadz6+
スネ夫の限界
僕は出来杉君
0336デフォルトの名無しさん
垢版 |
2020/07/11(土) 22:33:23.97ID:fJlL8BSP
>>334
でもお前の発言はなにもないじゃんw
壊れたレコードのように和田はだめ(理由なし)和田はだめ(理由なし)を
繰り返してるだけ。今度はTDDはだめっていうんですかね?w
0337デフォルトの名無しさん
垢版 |
2020/07/11(土) 22:37:09.78ID:JFnadz6+
>>336
僕は、和田はダメと一度も言ってない
僕のレスを全部読み直してみて
君は頭が働かないどころか勘が鈍い
0339デフォルトの名無しさん
垢版 |
2020/07/11(土) 22:40:20.87ID:fJlL8BSP
>>337
まるで和田メソッド(TDDの常識的な手法)に
限界があるような言い方してるじゃんw

自分が何も知らないのに、限界があるんじゃないかという
疑いをかけるのはだめ。
0340デフォルトの名無しさん
垢版 |
2020/07/11(土) 22:42:56.22ID:JFnadz6+
世の中に銀の弾丸は無いからね
何事にも限界はあるでしょ、一般論だよ
IQ低い人はすぐ被害妄想いだくから面倒
0341デフォルトの名無しさん
垢版 |
2020/07/11(土) 22:43:21.62ID:JFnadz6+
もっと知性あふれる人と知的な会話をしたいなー
0343デフォルトの名無しさん
垢版 |
2020/07/11(土) 22:45:11.39ID:fJlL8BSP
つまり

「お前の意見に言いたいことがある。一般論として人はだれでも間違える(ドヤァ)」

といっても意見にたいして、何かを言ってることにはならないのと同じね。
0344デフォルトの名無しさん
垢版 |
2020/07/11(土) 22:45:14.99ID:JFnadz6+
ちなみに僕は常識に価値があるとも思ってない
京都大学では真実は少数派に宿るっていう言葉が使われてるよ
0345デフォルトの名無しさん
垢版 |
2020/07/11(土) 22:46:07.36ID:JFnadz6+
>>342
疑いをかけられたんだームキーって反応してる君がおかしいってこと
0348デフォルトの名無しさん
垢版 |
2020/07/11(土) 22:50:38.71ID:JFnadz6+
>>347
そうだよ、僕は一般論をいっただけ
一つ指摘しておくと君は日本語を使ってる

わかるかな、僕のこの高度な皮肉が
0349デフォルトの名無しさん
垢版 |
2020/07/11(土) 22:51:31.82ID:fJlL8BSP
>>348
皮肉かどうかはどうでもいいな
少なくともお前はバカだということ
議論してるふりをしてるだけ
0350デフォルトの名無しさん
垢版 |
2020/07/11(土) 22:52:25.23ID:JFnadz6+
> >>337
> まるで和田メソッド(TDDの常識的な手法)に
> 限界があるような言い方してるじゃんw
>
> 自分が何も知らないのに、限界があるんじゃないかという
> 疑いをかけるのはだめ。

疑いをかけられてないと思ってる人間が疑いをかけるのはだめとは言わんでしょう
0352デフォルトの名無しさん
垢版 |
2020/07/11(土) 22:56:57.75ID:JFnadz6+
君は疑いをかけられてると思っていた
僕は一般論だよと言った
君は疑いをかけられてないと言い出した
僕はそんなの当たり前だろということを示すために君は日本語を使ってると
当たり前のことを言って皮肉った

という流れだったんだ
0353デフォルトの名無しさん
垢版 |
2020/07/11(土) 23:20:35.55ID:JFnadz6+
もうお互い大変でしょう、僕と仲直りしましょうか?
君にアホと言ったのは謝るよ、君が僕にバカと言ったのは忘れるよ
僕は心の広い知的なイケメンです
0354デフォルトの名無しさん
垢版 |
2020/07/12(日) 08:15:23.41ID:/RSb8Vzv
和田メソッドの真骨頂は、バグを作り込まなければテストする必要が無いことにある。

テストは甘え、甘えがある限りバグは無くならない。

つまり、テストしない仕組みづくりこそが和田メソッドである。
0355デフォルトの名無しさん
垢版 |
2020/07/12(日) 09:15:09.92ID:SoQxatgN
クソみたいな議論ばっかに見えるがプログラム技術板の中ではわりかしまともな方になってるぞ。
0358デフォルトの名無しさん
垢版 |
2020/07/12(日) 15:39:00.55ID:/RSb8Vzv
和田メソッド被害者の会結成しなくては。
0360デフォルトの名無しさん
垢版 |
2020/07/12(日) 16:04:35.47ID:/RSb8Vzv
それは恐ろしい話だけど、このスレにもちらほらいるね。
0361デフォルトの名無しさん
垢版 |
2020/07/12(日) 16:04:37.33ID:6LAoyHzZ
そういう人に、どういう被害を受けたかを説明できればね(笑)
結局、被害の内容を言えないんだから、被害はなかったということ
0362デフォルトの名無しさん
垢版 |
2020/07/12(日) 16:11:56.07ID:/RSb8Vzv
オウム真理教の信者は被害者でもあり加害者でもある。
0363デフォルトの名無しさん
垢版 |
2020/07/12(日) 16:47:10.65ID:6LAoyHzZ
上の方でも書いたけど「例え」は何かを批判するときに使ってはだめ
「それは別の話で関係ない」という簡単な一言が完璧な反論になってしまうから
0364デフォルトの名無しさん
垢版 |
2020/07/12(日) 17:15:44.85ID:/RSb8Vzv
和田メソッドの信者は被害者でもあり加害者でもある。
0366デフォルトの名無しさん
垢版 |
2020/07/12(日) 18:43:30.23ID:/RSb8Vzv
眉唾理論。
0367デフォルトの名無しさん
垢版 |
2020/07/12(日) 18:53:56.08ID:hGDsxp2M
>>366
なるほど、つまりTDDはテストが開発を駆動するという考え方で
テストによって実装や設計が導かれるということなのだけれども
設計過剰だったり設計不足だったりする
設計は本来ドメインに関する知識から導かれるものなので
入力、出力を決めたら自動的に最適な設計が見つかりますなんて
そんな都合の良いことが起こるわけもなくTDDは現代では否定されていて
単体テストよりもシステムテストを重視したほうが製品の品質はあがるわけですな
0368デフォルトの名無しさん
垢版 |
2020/07/12(日) 18:54:49.46ID:/RSb8Vzv
説明に対して全く聞く耳を持たず、和田経典に書いてあると繰り返すだけだから、宗教的なナニカ扱いされてる。
0369デフォルトの名無しさん
垢版 |
2020/07/12(日) 19:04:08.64ID:/RSb8Vzv
t-wadaがお勧めする和田メソッド。

騙されたやつ多いのでは。
0370デフォルトの名無しさん
垢版 |
2020/07/12(日) 19:10:42.57ID:6LAoyHzZ
>>367
> TDDは現代では否定されていて

どこで否定されてるの?さらっとウソを付かないように。
どうせすぐに俺がバラすんだから意味ないよ(笑)
0371デフォルトの名無しさん
垢版 |
2020/07/12(日) 19:20:59.87ID:/RSb8Vzv
どこで否定されてるのとか、これまでのみんなの説明が全くの無駄。

和田さんには和田さんの経典があり、みんなの意見には耳を貸さない。

だから宗教と言われてる。
0372デフォルトの名無しさん
垢版 |
2020/07/12(日) 19:22:03.23ID:hGDsxp2M
前スレですばらしい分析を見たなあ

897+1 :デフォルトの名無しさん [↓] :2020/07/05(日) 11:28:59.86 ID:YdQ981ul
>>870
新しい理論や手法を提唱する人には良くあることだと思うけど、その理論はある前提、ある側面では正しいけど、常に無条件に適用することは正しくないと本人は分かっていて、敢えてそういうことはわざわざ詳しくは説明しない。自分の論が有用な物だと主張したいがため、嘘はつかない範囲で相手が勝手に誤解してすごいと思わせるような物言いをする。
で、その理論に感銘を受けた人の一部が、理論の表面的な効能だけをありがたく受け取って問題点や前提条件などは正しく理解しないまま、受け売りの知識を他所で披露する。
そこで議論になると、本質をちゃんと理解してないまま自説を擁護しようとするから、無理が生じたり話が噛み合わなかったりする。
という流れでイマココなのかなと思う。
0373◆QZaw55cn4c
垢版 |
2020/07/12(日) 19:58:09.07ID:YoHAyY/u
>>372
昔の言い方でいうところの「東大話法」というやつですね…
0374デフォルトの名無しさん
垢版 |
2020/07/13(月) 00:50:54.57ID:b4eaK6qk
>>372
素晴らしい分析? それはTDDに関しての分析じゃないよ
その文章はTDDに関して何一つ言及していない。
0375デフォルトの名無しさん
垢版 |
2020/07/13(月) 00:54:17.24ID:b4eaK6qk
>>371
ここに和田さんはいないんだから、意見を聞かないはずだという逃げの言葉で
お前の意見を言わないのはおかしい。

他人が意見を聞くかは関係なく、
お前の意見を言えばいい。

言えないなら、反論するすべがないというのがお前に対する結論だ。
0379デフォルトの名無しさん
垢版 |
2020/07/13(月) 06:26:53.87ID:7vLZz4H7
>>375
イイエ居ます。
みんな説明してます。
見えないことにするなら、みんなの書き込みが無駄です。

和田メソッドはカルト宗教の様相を呈してきた。
0380デフォルトの名無しさん
垢版 |
2020/07/13(月) 07:01:21.00ID:7vLZz4H7
和田メソッドのせいで日本のITが10年遅れた。
0382デフォルトの名無しさん
垢版 |
2020/07/13(月) 08:39:56.06ID:7vLZz4H7
イイエ違います。
和田メソッドは宗教です。
0383デフォルトの名無しさん
垢版 |
2020/07/13(月) 08:41:17.44ID:7vLZz4H7
和田さんはこのスレに居ないと書き込んでるのが御本人かもしれない。
0384デフォルトの名無しさん
垢版 |
2020/07/14(火) 13:34:51.74ID:6KNOtJR0
ステマスレ。
0385デフォルトの名無しさん
垢版 |
2020/07/16(木) 12:32:21.61ID:PwJLBkvh
失速したな
TDDはプロトタイピングと組み合わせると良いかもね
テスト書かずに概ね正確に動作するコードを書いた後に
ブラッシュアップする目的でTDDを使って書き直す感じ
0386デフォルトの名無しさん
垢版 |
2020/07/16(木) 12:34:19.44ID:PwJLBkvh
TDDを布教する人が何回も同じコード書いてうまくなっていくように
書き捨てたコードの数だけTDDは洗練されるんじゃなかろうかと
0387デフォルトの名無しさん
垢版 |
2020/07/16(木) 13:59:03.56ID:r2RuGKFG
和田メソッドのせいで失われた日本ITの20年。
0389デフォルトの名無しさん
垢版 |
2020/07/16(木) 15:51:48.48ID:F4CmQs0T
テスト書くタイミングについてなら少しだけ。
わりとだら〜と書いて関数なりクラスなり切り出したタイミングで書く感じ。
テストから書くってのは普通の人には難易度高い気がするわ。
0390デフォルトの名無しさん
垢版 |
2020/07/17(金) 02:41:00.28ID:sGfB37JM
最終的なプログラムの詳細設計がパッと頭に浮かぶ人ならテストから書けるんだろうけど
プロトタイプぐちゃぐちゃ作って、やっと構造が決まって、とりあえず動くもの作った後でリファクタリング、な俺には無理だなぁ
0397デフォルトの名無しさん
垢版 |
2020/07/26(日) 01:00:24.09ID:5rw0opQZ
相変わらずオブジェクト指向信じて
頑張ってるJavaプログラマさん達に
お伺いしたいんだけどさぁ

Javaでオブジェクトをsystem.out.printしても
変な文字列出てくるだけでオブジェクトの中身見れないよね?
これってあんたらの好きな「カプセル化」のせいでしょ?
これ新人にはめっちゃ不人気でみんなJavaディスってんだよね。

一方JavaScriptやPythonは
オブジェクトをconsole.logするとオブジェクトの中身
全部一目瞭然に見れるし▶ボタンで折りたたみとかも出来
ちゃうわけよ。
Pythonは折り畳めないけどそれでも見やすいよ。

こんな簡単な揺るがぬ真実を説明するのに
「コンストラクタ」とか「ポリモーフィズム」とか
「メソッド」「インタフェース」「継承」
「オーバーライド」こんなクソみたいな単語を一切使わなくても
簡単に説明できるわけ。

これでJavaScriptやPythonはイケてる言語で
Javaやオブジェクト思考は糞だって事が分かったね。
誰でも簡単に理解できるよね。
0399デフォルトの名無しさん
垢版 |
2020/07/26(日) 01:16:16.56ID:T2XYMYOv
わかりやすいREPLが使える言語のほうが学習効率が高いのは確かだが
標準でオブジェクトの中身がprintされるかどうかはカプセル化とは関係ない
0400デフォルトの名無しさん
垢版 |
2020/07/26(日) 02:14:47.15ID:uGb+RxKs
p obj

Ruby なら、これでインスタンスの内容が分かる

この時に、Object ID みたいな謎の文字が表示されて困る場合は、
Object#inspect をオーバーライドして、好きな内容に変える

これは、たいていの言語の「Effective 何々」という本に書いてある。
まず最初に、表示メッセージを分かりやすいように、オーバーライドしろって
0401デフォルトの名無しさん
垢版 |
2020/07/26(日) 10:27:42.72ID:XQciIU0B
>>397
> Javaでオブジェクトをsystem.out.printしても
> 変な文字列出てくるだけでオブジェクトの中身見れないよね?

JavaScriptのオブジェクトは連想配列

というわけで、Javaで連想配列を作ってprintしてみた
https://paiza.io/projects/OnW9KR89v5m-CY5JXIV2tw

> これってあんたらの好きな「カプセル化」のせいでしょ?

オブジェクトをprintしたときはそのオブジェクトのtoStringメソッドが呼ばれる
これは「ポリモーフィズム」のおかげ

toStringメソッドはObjectクラスで宣言されている

すべてのオブジェクトはObjectクラスを「継承」しているため
toStringメソッドを「オーバーライド」して任意の値を返却できる

「カプセル化」は関係ない

> 一方JavaScriptやPythonは
> オブジェクトをconsole.logするとオブジェクトの中身
> 全部一目瞭然に見れるし?ボタンで折りたたみとかも出来
> ちゃうわけよ。

すてきなデバッガです
0402デフォルトの名無しさん
垢版 |
2020/07/26(日) 10:36:11.38ID:XQciIU0B
PythonやJavaScriptがイケてる言語であることは間違いない
Javaよりも開発者多いのじゃないかな

PythonはAIで使われているし大学の授業でも使われていて
それまでC言語で教えてた内容をPythonで教えるようにしたら
学生の成績が飛躍的に上がったという話がある
人間の認知能力に最適な言語

JavaScriptはWebのクライアントでもサーバでも使われていて
日進月歩で進化している最も熱い言語
0403デフォルトの名無しさん
垢版 |
2020/07/26(日) 10:45:55.24ID:XQciIU0B
Javaは昔はオブジェクト指向一筋の堅物みたいな感じだったけど
最近はラムダ式やStream、CompletableFutureの導入など
どちらかというと関数型の方に傾倒していて、オブジェクト指向と関数型の
良いとこ取りをしようとしてる
0405デフォルトの名無しさん
垢版 |
2020/07/27(月) 09:27:57.59ID:EH5Hzntf
そもそも単体で平置き出来る関数が出来るまでバカみたいに長い年月が掛かったからその間に他の言語に抜かされていった
0406デフォルトの名無しさん
垢版 |
2020/07/27(月) 12:53:06.35ID:uT7O59Px
オブジェクト指向もテストの文脈で語られるようになって、
だいぶ胡散臭い馬鹿が減ったと思う。
0407デフォルトの名無しさん
垢版 |
2020/07/27(月) 13:33:10.26ID:EH5Hzntf
胡散臭くない小奇麗なバカは減って無い、ってことだな
0408デフォルトの名無しさん
垢版 |
2020/07/27(月) 15:11:13.32ID:JMeMRaZ4
論理的には間違ってる
0410デフォルトの名無しさん
垢版 |
2020/07/27(月) 21:54:44.65ID:qUTrza9Z
TDDに限定するならともかく、一般論として「テストの文脈で」語ろうとするのは
逆にそっちの方が胡散臭いなぁ。
0414デフォルトの名無しさん
垢版 |
2020/07/29(水) 00:11:33.88ID:ap0sh9Fh
class/object instance scopeにあるmethodではない関数または関数objectのことではないかいな
0418デフォルトの名無しさん
垢版 |
2020/07/29(水) 08:44:34.08ID:yJ6wpcWu
文脈でわかると思うけどね
自分の辞書にないからわからないというやつはただのアホ
0419デフォルトの名無しさん
垢版 |
2020/07/29(水) 08:52:18.07ID:yJ6wpcWu
慎吾ママが両手を広げて「おっはー」と言ったらおはようの意味だとわかるし
貴乃花親方がドアを開けて「あーす」と言ったらおはようございますの意味だとわかるだろ
「平置きできる関数」がわからない人は自分が八角理事長だと自覚したが良い
0422デフォルトの名無しさん
垢版 |
2020/07/29(水) 11:23:16.72ID:yJ6wpcWu
>>421
文脈がわからない人間が議論に参加するべきではないと思うの

他人の言葉には寛容に、自分の言葉は厳密にが会話の基本
議論は会話の積み重ねなんだから会話の基本ができない人間は議論ができない人
他人の言葉に厳しい態度とっても良いことなんて無いよ
0423デフォルトの名無しさん
垢版 |
2020/07/29(水) 11:26:28.92ID:yJ6wpcWu
プログラムでもそうだよね
メソッドを宣言するときは引数はできるだけ広い型
戻り値はできるだけ狭い型
にすることで他のオブジェクトと協調しやすいプログラムができる
なんでもかんでもインターフェイス使おうとするJavaの習慣は誠に遺憾
0424デフォルトの名無しさん
垢版 |
2020/07/29(水) 11:27:35.62ID:yJ6wpcWu
他人には厳しいみなさん
0425デフォルトの名無しさん
垢版 |
2020/07/29(水) 11:33:51.35ID:2AXsdL6T
自分の説明能力の無さを相手が低脳だからと責任転嫁するヤシ
0426デフォルトの名無しさん
垢版 |
2020/07/29(水) 11:36:20.63ID:yJ6wpcWu
我々人間もメソッドなのかも知れませんね
0427デフォルトの名無しさん
垢版 |
2020/07/29(水) 11:38:34.39ID:10XNhQ52
>>422
> 自分の言葉は厳密にが会話の基本
いやだよばーかw
俺の言葉は寛容にだ。平置きでわからんやつが悪い
お前は俺の言葉に寛容になれな。
0428デフォルトの名無しさん
垢版 |
2020/07/29(水) 11:38:43.76ID:yJ6wpcWu
自分の理解能力の無さを相手が無能だからと責任転嫁するココナツ
0429デフォルトの名無しさん
垢版 |
2020/07/29(水) 11:39:49.67ID:yJ6wpcWu
>>427
僕は平置きでわかる派ですよ
完全に理解した
0430デフォルトの名無しさん
垢版 |
2020/07/29(水) 11:41:33.11ID:1IRv8wde
で、結局のところ
Javaで「単体で平置きできる関数」って何なの?

コードで示してくれるといいんだか
0431デフォルトの名無しさん
垢版 |
2020/07/29(水) 11:42:06.25ID:yJ6wpcWu
>>430
() -> "coconut"
0434デフォルトの名無しさん
垢版 |
2020/07/29(水) 12:47:42.81ID:yJ6wpcWu
>>432
どこだと思う?
0435デフォルトの名無しさん
垢版 |
2020/07/29(水) 13:01:46.48ID:yJ6wpcWu
無限ココナツ
Stream.generate(() -> "coconut").forEach(System.out::println);
0436デフォルトの名無しさん
垢版 |
2020/07/29(水) 13:03:28.35ID:yJ6wpcWu
変数にセット可能、引数として渡すことができる、戻り値にセットできる
これが平置き三原則
0437デフォルトの名無しさん
垢版 |
2020/07/29(水) 13:06:58.34ID:vCcy0xOf
Javaはクラスに包んで間接的に置くしかない
これが最大の欠陥
0438デフォルトの名無しさん
垢版 |
2020/07/29(水) 13:29:06.56ID:Lu0VWFvI
単体でもなければ平置きでもなくて草生える
0441デフォルトの名無しさん
垢版 |
2020/07/29(水) 18:21:34.93ID:TpnjQV/H
第一級函数のことかと思ったよ俺は
馬鹿は1つしかモノを知らないから適当に言っても1つの意味にしかならないが他人はお前よりモノを知ってるから第一級函数なのかラムダ式なのかそれとも自分が知らない別の概念なのか判断できないんだよ
0442デフォルトの名無しさん
垢版 |
2020/07/29(水) 18:32:59.18ID:T5TGNuPi
結局単にラムダ式のことを言おうとしてたん?
それだけのことをなぜ平置きとか言い出しちゃったのかなw

見苦しいからもうこれ以上レスいらんぞ
0443デフォルトの名無しさん
垢版 |
2020/07/29(水) 18:34:25.78ID:yJ6wpcWu
平置き式のこと?
0445デフォルトの名無しさん
垢版 |
2020/07/29(水) 18:40:24.30ID:yJ6wpcWu
単体で置ける関数のことを単体関数と言い、それを平置きして式化したものが平置き式
ラムダ式なんて西洋かぶれのバズワードを使わなくても説明できるのができるプログラマ
0447デフォルトの名無しさん
垢版 |
2020/07/29(水) 18:59:31.61ID:zMv38iUQ
みーっけた!
こうゆう関数併記するスタイルの事じゃないの?
プログラミングのお題スレ Part18
http://itest.5ch.net/mevius/test/read.cgi/tech/1594702426/124
https://github.com/katahiromz/3D

function add_line(x0, y0, z0, x1, y1, z1) {
}
function set_pos(x, y, z) {
}
function set_dir(dx, dy, dz) {
}
function walk(delta) {
}
function turn_dir(dx, dy, dz) {
}
function turn_angle(angle) {
}
function init() {
}
function koch(degree, step) {
}
function draw() {
}
function animate() {
}
0449デフォルトの名無しさん
垢版 |
2020/07/29(水) 20:44:56.64ID:f9ldngpW
フォルダに平積みする事か?
A.class
B.class
C.class
D.class
E.class
0451デフォルトの名無しさん
垢版 |
2020/07/29(水) 23:30:32.60ID:eNj62kDo
ポリモーフィズムって押し付けなんだよね
汎用的な機能を提供する
与える引数だけが戻り値を決めるような
純粋な関数を1つくればDRYになっていいものを、

何らかの意図を持った特化した関数を
幾つも定義しなければならない
意味がわからない。

インスタンスには極力状態を持たせない方が
圧倒的にバグが少ない

UI制御の状態ならGUI上だけで
本当に重要な状態ならDB上やセッションとかで
持つくらいで大体は事足りる
クラスのフィールドなんてほとんど使わんよ

引数と戻り値
配列 連想配列をとことん突き詰めれば
大抵の事はなんでも出来る。
これが構造化プログラミング
0453デフォルトの名無しさん
垢版 |
2020/07/30(木) 00:11:51.67ID:3OVhn9K/
>>451
それが設計意図がキチンとドキュメントにまとまっていれば
こうなったときに引数増やすしか無いかとかわかるんだけど
だいたいドキュメント書かないバカがノリで作ったようなポリモだから
頭にくるんだよね
作ったやつのおバカなドヤ顔に拳をブチ込んでその場で正座させながらドキュメント書かせたい
0454デフォルトの名無しさん
垢版 |
2020/07/30(木) 08:29:08.61ID:aMAEXQwY
>>451
単純にモジュール切り分けテクニックの一つなだけだよ。
変な切り分けすればそりゃ可読性悪くなるわ。
オブジェクト指向をいつでもすべしみたいな馬鹿が誤解をひろめたのがいかんだけで有用なテクニックの一つではある。
0455デフォルトの名無しさん
垢版 |
2020/07/30(木) 10:11:39.63ID:6431nXoC
ドキュメントとセットでの運用なら、
それ自体では完結してない、つまりは欠陥品ってことでしょ

ドキュメントの有無や書いた奴の頭の程度で決定したりはしない
0457デフォルトの名無しさん
垢版 |
2020/07/30(木) 12:33:29.09ID:6431nXoC
コードそのものが「文芸的」になる必要がある
0458デフォルトの名無しさん
垢版 |
2020/07/30(木) 13:15:44.34ID:XKQCIMIB
ソリューションエクスプローラーなんて芋っポイのやめてWordの項目一覧でいいよ
そこの項目に対応したソースを記述すればいい
0459デフォルトの名無しさん
垢版 |
2020/07/30(木) 13:21:46.37ID:odFw/CMl
ソリューションエクスプローラのCMakeターゲットビュー見てみろよ。
そんなこと言えなくなるだろ。
0461デフォルトの名無しさん
垢版 |
2020/07/30(木) 13:28:55.06ID:odFw/CMl
それはちょっと違うかもしれないな。
プログラミング言語は自然言語と比較して非常に制約がきつく、それは機械が読めるほどだ。
自然言語で書くよりもプログラミング言語で書く方が誤解の余地が少ない優れた文書になるのではないか。
0462デフォルトの名無しさん
垢版 |
2020/07/30(木) 14:36:27.17ID:jRBN85oj
data Status = Dead | Alive

you == not Alive

お前はもう死んでいる
0466デフォルトの名無しさん
垢版 |
2020/07/31(金) 07:44:49.12ID:0J+iX777
>>455
プログラムで表現しずらいものをドキュメントで補うんだよ。
SIerに提出するような糞アリバイドキュメントばっかりつくってると理解できないだろうけれど。
0467デフォルトの名無しさん
垢版 |
2020/07/31(金) 09:46:54.45ID:UpUkpE84
プライベートメソッドのドキュメントを作るんだろ?
欠陥品じゃん
0468デフォルトの名無しさん
垢版 |
2020/07/31(金) 12:50:08.54ID:0J+iX777
プライベートだろうとパブリックだろうと、構造がコードでわかりにくけりゃ作るよ。
そういう表面的なことでしか判断できないのは頭が悪い証拠だと思うよ。
0469デフォルトの名無しさん
垢版 |
2020/07/31(金) 13:53:02.12ID:J/Hsbz2N
和田信者は頭が欠陥品
0470デフォルトの名無しさん
垢版 |
2020/07/31(金) 15:26:19.59ID:+g+2reUI
要するに馬鹿にはプログラミングさせるなということだな
馬鹿が書くと変なものをprivateにしてしまって大混乱
プライベートメソッドをテストせざるを得なくなる
0471デフォルトの名無しさん
垢版 |
2020/07/31(金) 20:54:13.68ID:UpUkpE84
普通は表面的=形式的なモンで判断するんでしょこの業界
だって形式しかねーもん
0472デフォルトの名無しさん
垢版 |
2020/08/01(土) 01:42:55.39ID:JfG80/LC
構造図みたいなのはプログラム内には書けないから
それは文章化しておくしかないから仕方がない
0475デフォルトの名無しさん
垢版 |
2020/08/30(日) 15:04:18.01ID:i3Iv6gG3
>>397
>相変わらずオブジェクト指向信じて
>頑張ってるJavaプログラマさん達に
>お伺いしたいんだけどさぁ

ならば「チンポがシコシコする」という日本語表現は、文法的に正しいのか?

チンポ「を」シコシコするのではなくて、チンポ「が」シコシコする。この場合、「チンポ」は主語となる。

オブジェクト指向で言う「集約」は2種類あって、全体(俺)と部分(チンポ)が繋がっている場合と、
全体(俺)と部分(チンポ)が別々になっている場合とが考えられる。けれども「チンポ」はそれ自体
が独立した生き物であり、所有者の意思とは無関係に、勃起して「シコシコする」。
例えば寝てる時にエロい夢みて朝起きてみたらチンコが勃起して射精してたとか。

違うか?

「胸がドキドキする」は良いが、「チンポがシコシコする」はダメな理由を、50字以内で述べろ!
0476デフォルトの名無しさん
垢版 |
2020/11/16(月) 10:13:57.47ID:PECNoX7v
>>397
要するに君のスペックや君が手掛けてきたシステムは
オブジェクト指向を検討する程のものじゃなかったし
今後もオブジェクト指向を検討するようなシステムに
君が係ることもなんだろうということは理解できた
■ このスレッドは過去ログ倉庫に格納されています