カプセル化の有害性、オブジェクト指向は愚かな考え

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2020/06/18(木) 23:47:36.69ID:l/2SQUll
カプセル化(英語:encapsulation)とは、オブジェクト指向を構成する概念の一つで、オブジェクト内部のデータを隠蔽したり(データ隠蔽)、オブジェクトの振る舞いを隠蔽したり、オブジェクトの実際の型を隠蔽したりすることをいう。

かつて偏差値の低い学校向けの情報処理系教科書において「カプセル化は大変すばらしいものであり絶対に使うように」と大体的に宣伝された。

一方、カリフォルニア大学バークレー校の有識者を中心とした「インターネットを作った人たち」は「階層化の有害性」として「カプセル化は絶対にやめろ」としている。

https://monobook.org/wiki/%E3%82%AB%E3%83%97%E3%82%BB%E3%83%AB%E5%8C%96(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0)
780デフォルトの名無しさん
垢版 |
2020/07/05(日) 03:04:01.72ID:LRfXHt7v
正しいとか正しくないとかどうでも良いので、privateのテストをさせてほしいものですね。
2020/07/05(日) 03:05:23.08ID:58eR5uXa
>>778
> 今関わってる製品とかソース10万ファイルくらいあってそれぞれのファイルに
> 分岐なんか少なくとも数十から数百はあると思うが、その数百万から数千万、下手したら
> 億の分岐を全部全パターンテストするの?

それユニットテスト関係ないよね?

手動で全パターンをテストするの?
答えはお前自身が言えるはずだよね?
2020/07/05(日) 03:06:25.42ID:58eR5uXa
ユニットテストなんかしてねーよ
ソース修正するたびに、
億の分岐全パターン手動テストしてるんだよ!

って言ってほしいな?
まだかな?
783デフォルトの名無しさん
垢版 |
2020/07/05(日) 03:13:56.54ID:LRfXHt7v
けんか腰は知能が高いと言われるム板に似合わないんだよな。
ユーモアを交えて会話するべきだと思います。
2020/07/05(日) 04:06:24.23ID:9F15TCk0
>>779
知ってる限りGAFAでもERP各社あたりでもやってないけどね。

試しに(ドイツだが)SAPあたりにカバレージどれだけですかって聞いてみれば?
何それ美味しいの?だよ。

まあこういう人は何言っても無駄だし下手に事実いうと発狂するからもう相手は
おしまい。
2020/07/05(日) 04:11:13.84ID:58eR5uXa
ではGoogleの事例

https://feb-acchan.hat
enablog.com/entry/2018/03/11/214344

現状について
Googleでは、420万ほどのテストが存在して、1日1億5千万テストケース
実行されていて(150million test execution/dayだからあってますよね?)、
1テストケースあたり35回実行されているらしいです。

そして、これらがすべて自動テストであり、手動テスト率が驚異の0%!
ただし、UX系のテストは手動だそうです。
UIのテストなどは自動化できるが、UXはさすがにまだ人手とのことで、
人の感覚などが関係するUXテストがAIによってテスト可能で人の仕事が無くなるといった日はまだ到来していません。

自動テストですが、毎テストごとに420万テストケースを実行しているわけではなく、
全テストケースを実行するのは一定の間隔で、普段は修正に対して依存があるテストだけを実行しているそうです。
2020/07/05(日) 04:13:30.65ID:58eR5uXa
Googleの考え方

https://www.publickey1.jp/blog/11/post_144.html

テスターはデベロッパーがテストできるようにするのが仕事
このようにEngineering Productivityのメンバーのレポートラインと
所属を分けることのメリットを、Whittaker氏は次のように書いています。
ここにグーグルの品質管理の大事なポイントがあるようです。

一般にテストは製品開発の最後の段階で行われることが多く、製品チーム/開発チームの
中にテストチームを抱えても、テストフェーズ以外は手持ちぶさたになってしまうため、
多くの開発組織ではテストチームは製品チーム/開発チームとは別に存在し、
必要なときに登場してテストを行う、というケースがほとんどです。

====以下重要====

ところがグーグルではEngineering Productivityに属する、テストのノウハウを持ち支援を
行うエンジニアたちは、前述のように各製品チームに所属しています。

そう、グーグルではテストチームではなく、製品チームが自身で品質管理を負っている。
各デベロッパは自身でテストすることを期待されている。テスターの仕事は、自動テストの
インフラを確立することと、それによってデベロッパ自身がそれをプロセスの中で実行できるようにすること。
テスターはデベロッパーがテストできるようにするのだ。

各製品チームは、Engineering Productivityのメンバーの支援を受けつつ、自分たちの責任で
テストを行わなければならない、ということがグーグルのテストを行う際のポリシーのようです。
2020/07/05(日) 04:14:26.63ID:58eR5uXa
https://www.publickey1.jp/blog/11/post_144.html

Whittaker氏はさらに次の記事「How Google Tests Software - Part Two」で、
エンジニアに与えられる3つの役割についても触れています。

Softweare Engineer in Test(SET)
テストのしやすさ(Testability)にフォーカスした役割。デザインレビューをし、
品質やリスクをチェック。コードをテストしやすいようにリファクタリングする。
ユニットテストや、テストフレームワーク、自動テストも書く。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2020/07/05(日) 04:16:28.52ID:58eR5uXa
「コードをテストしやすいようにリファクタリングする。」

っていうのがまさにprivateでテストしたいのに
public経由でテストできない

ならばテストしやすいようにリファクタリングしましょうって話になってる
2020/07/05(日) 04:18:26.54ID:58eR5uXa
https://monoist.atmarkit.co.jp/mn/articles/1705/24/news008.html

C/C++かつxUnit系ツールは、数分調べるだけでも数種類見つかります。
今回はその中の1つ「Google C++ Testing Framework(以下、GoogleTest)」の
使い方を紹介します。

Google Testとは、IT業界の巨人、グーグル(Google)製の
単体テストフレームワーク(C/C++用)です。MinUnitと比べて高機能で、
さまざまな使い道があります。ただし、MinUnit同様、テストコードを記述するため、
C/C++をある程度知ってることが前提です。
2020/07/05(日) 04:19:35.40ID:9F15TCk0
>>785
テスト件数が問題なのではない。オートメーションすればファンクショナルレベル
でのテストはいくらでも流せる。

新しいファンクション・メソッドを書くたびに、あるいは変更をするたびに
全ての条件を網羅して、それをテストケースにして、コード自体をモディファイして
テストした後、結果をドキュメント化してまたコードを元に戻すということはやらないという話。

プライベートのファンクション・メソッド単位でC2100%テストしていくというのは
そういうこと。
2020/07/05(日) 04:22:02.73ID:58eR5uXa
米Google、JavaScriptユニットテストフレームワーク「JS Test」をオープンソースで公開
https://mag.osdn.jp/11/10/03/1012250

米Googleは9月29日、JavaScriptユニットテストフレームワーク「Google JS Test」を発表した。
元々はGoogle社内のプロジェクトで利用されていたもので、ライセンスはApache License 2.0。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
792デフォルトの名無しさん
垢版 |
2020/07/05(日) 04:27:51.71ID:9F15TCk0
いや、だからそういうツールがあるのなんて常識だが、privateはテストしない。
上にも書いてるがprivateはソース自体弄らないとテスト自体できないわけで、
そういうツールが自動でソースを弄ってコンパイルし直してprivateのメンバーを
全パターンするわけでは、当たり前だけど、無い。

クラス単位でパブリックのメソッドに対してテストコードもセットで書くということは
当然ある。
2020/07/05(日) 04:29:16.12ID:58eR5uXa
facebook / jest
https://github.com/facebook/jest

https://jestjs.io/ja/
Jest はシンプルさを重視した、快適な JavaScript テスティングフレームワークです。
2020/07/05(日) 04:31:02.86ID:9F15TCk0
全くわかってないなこりゃ。
2020/07/05(日) 04:33:27.78ID:58eR5uXa
反論すりゃいいのにw
2020/07/05(日) 04:34:11.33ID:58eR5uXa
憶測に基づいた発言はいらないよ?
俺はGoogleやFacebookとユニットテストに関連する事例を上げただけ
797デフォルトの名無しさん
垢版 |
2020/07/05(日) 04:34:11.73ID:LRfXHt7v
テストの専門家だからそう思うのでは。
798デフォルトの名無しさん
垢版 |
2020/07/05(日) 04:49:06.73ID:LRfXHt7v
完ぺきにテストしたからといって製品の完全性を保証することはできません。
したがってテストしないほうが良いのです。
2020/07/05(日) 04:52:22.10ID:58eR5uXa
ほらなw

完璧にテストした所で落ちない飛行機はありません
したがってテストしないほうがいいのです

と言い始めた
事例と自分の考えの矛盾を正せず、頭が狂い始めた証拠。
ここから荒らしと変貌する前触れだな
800デフォルトの名無しさん
垢版 |
2020/07/05(日) 04:53:23.27ID:LRfXHt7v
食いついてきた。
嘘みたい。
801デフォルトの名無しさん
垢版 |
2020/07/05(日) 04:58:23.98ID:LRfXHt7v
privateもテストさせていただけるとありがたいけど、禁止するのが正しいことになってるからな。
802デフォルトの名無しさん
垢版 |
2020/07/05(日) 04:59:58.66ID:LRfXHt7v
Visualstudioのテストエクスプローラを使うと考えが変わるのでは。
道具の問題かもしれない。
803デフォルトの名無しさん
垢版 |
2020/07/05(日) 05:53:15.48ID:9F15TCk0
ユニットテストというのはプロジェクトによってかなり幅があるわけで、
当たり前の話だがテストオートメーションのプログラムが勝手にコード
弄ってコンパイルしなおしてPrivateをテストするわけが無いのだよ。
2020/07/05(日) 06:05:37.56ID:58eR5uXa
↑みたいなことを言ってるやつがGAFAは〜と
なんのソースもなしに言ってるわけだよ
こんなやつの話を聞くやつがいると思うかね?
805デフォルトの名無しさん
垢版 |
2020/07/05(日) 06:06:03.12ID:9F15TCk0
ずれるかもしれないが下のような場合、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;}
}
2020/07/05(日) 06:21:04.56ID:9F15TCk0
あと日本のNTTデータから降りてくるような大企業案件とかもやったことが無いので知らん。
アメリカのビジネス系一般の話。
2020/07/05(日) 06:25:10.48ID:M+BkbwUs
>>805
そのコードを見ただけで素人ってわかるよw
2020/07/05(日) 06:27:32.73ID:9F15TCk0
はいはいそうですね。
2020/07/05(日) 06:33:43.45ID:M+BkbwUs
1. 関数名が意味不明
2. インデントがめちゃくちゃ
3. スペースを入れる所が統一されていない
4. lenが配列なのはなんでだ?
5. nullを情報として扱うな
6. 戻り値なしなのに関数の最後でreturnを書くな
7. 数値(長さ?)判定と文字出力を同じ関数に同居させるな
8. テストするなら、長さを入力し文字列を返す関数を作れ

なんでたったこれだけの関数で
こんなにレビューの指摘項目が存在するんだかw
810デフォルトの名無しさん
垢版 |
2020/07/05(日) 06:38:43.59ID:9F15TCk0
口調が気持ち悪い人は相手しても仕方ないからほっとくとして、上の例だと(に限らず)
funcSとfuncBをテストするためにはコード弄らなきゃいけないし、そもそもtestChin()で
リクワイアメントとエッジケースは全てテストするんだから、無駄にテストが倍以上に
なるしそれも手動になる。

普通のケースだとtestChinに対するテストコード書いて、変更があればそれを流す形になる。
上にさんざコピペが貼られたテストツールはそういうのを自動で流すツール。

テストケース流したいからfuncSとfuncBをパブリックにするというのはカプセル化
できてないし、ましてコード弄ってまでテストするのを手順化するというのは普通はやらない。

書いてる最中にコードちょろっと入れて確認するようなことはあって、それもユニット
テストといえばユニットテストだが、手法としてプロジェクト単位で公式にやるような
ものでは普通は無い。

車のブレーキ制御とかならそこまでやって欲しいが、OOとかカプセル化とはちょっと
違う話。
2020/07/05(日) 06:42:42.57ID:M+BkbwUs
> funcSとfuncBをテストするためにはコード弄らなきゃいけないし、そもそもtestChin()で
public経由でテストできるだろw
812デフォルトの名無しさん
垢版 |
2020/07/05(日) 06:45:32.12ID:9F15TCk0
>public経由でテストできるだろw
と、いうわけでPublicをテストすれば十分だしPrivateは(普通は)やらないという事を
やっとご理解いただけたようですな。

>>768ではこんな事言ってましたが。
>当然ソースを書いて(書き換えて)テストするに決まってるじゃん
2020/07/05(日) 06:47:04.12ID:M+BkbwUs
>>810
他の言語を勉強したほうがいいぞ
どうもお前は、絶対に来るはずがない値が引数に渡された時、
そのテストしろって言ってるようだからな

「絶対にありえない値」なんだから仕様なんて作らない
他の型がない言語だったら、引数に渡されるオブジェクトなんか
それこそ無限に値なんてありえるだから

privateでも、ソースコードを修正して引数渡せるなら
そのテストをかけって言ってるようなもん
2020/07/05(日) 06:47:52.42ID:M+BkbwUs
>>812
> と、いうわけでPublicをテストすれば十分だしPrivateは(普通は)やらないという事を

頭悪そうだなw

この場合publicメソッドを呼んだらprivateメソッドを呼び出すんだから
privateメソッドのテストになってるだろ
2020/07/05(日) 06:47:57.37ID:9F15TCk0
少なくともグーグルの面接で絶対こないからテストしないとか言ったら
速攻落ちるよ。むしろ絶対こないのをやるものだからね。
2020/07/05(日) 06:49:10.31ID:M+BkbwUs
>>768

> まさかpublic・privateメソッドのテストをテスト工程でやる、
> public・privateメソッドを書いた人と別の人がやるって思ってないか?
>
> public・privateメソッドを実装中に、その作ったもののが正しく動くかどうか
> public・privateメソッドのソースを書いた人が、書いてる段階でテストするんだから
> 当然ソースを書いて(書き換えて)テストするに決まってるじゃん

と言ってますが、今の話と何の関係があるんですか?
「誰がテストするか」の話なんですが?
2020/07/05(日) 06:50:26.40ID:M+BkbwUs
>>815
だからpublicメソッド経由でテストしてるじゃんw

お前は、内部でprivateメソッドを呼び出しているから
publicメソッドのテストには、privateメソッドがそんな値を返そうが
そのテストは書かないのか?
2020/07/05(日) 06:53:15.16ID:M+BkbwUs
例えば>>805 の話だと
testChinがpublicメソッド、そのメソッドのテストとして
引数に1(なんで配列か知らんが)となるものを渡したら
Smallestが返ってくることというテストを書く

それは実際には内部でprivateメソッドを呼び出しているのだからfuncSのテストになってる
カバレッジを計測したら、privateメソッドであるfuncSの該当行は実行した(テストした)と計測される。
819デフォルトの名無しさん
垢版 |
2020/07/05(日) 06:54:07.51ID:9F15TCk0
え、コーディング中にちょろっとコード書いて動作確認とかを「テスト」って
呼んでたの?そりゃ噛み合わないわ。

開発手法の話をしてる時に「テストする」というからにはテストケースを書いて、
手動にしてもコードにしても実行したログくらいは残すものだが。

君はメソッド作る時エッジケースやらネガティブテストやら考慮に入れつつケースを
書いて実行したログも残してるの?変更のたびにやるの?やらんだろ。
2020/07/05(日) 06:56:15.75ID:M+BkbwUs
>>819
どれにレスしてるの?
ユニットテスト(かつ自動テスト)の話しかしてないんだが
お前がどこを呼んでそう思ったのか
具体的に指摘してみて
821デフォルトの名無しさん
垢版 |
2020/07/05(日) 06:56:44.73ID:9F15TCk0
publicをテストしたらprivateも呼ばれてるからprivate単位でテストしてる!って
ブレブレやなw

publicから呼ばれないprivateなんて一体誰がなんのために書くんだよw
2020/07/05(日) 06:57:27.80ID:M+BkbwUs
>>819
> 君はメソッド作る時エッジケースやらネガティブテストやら考慮に入れつつケースを
> 書いて実行したログも残してるの?変更のたびにやるの?やらんだろ。

変更のたびって、お前変更のたびにメソッドの仕様が変わるのか?
いきあたりばったりで開発してるんだな
2020/07/05(日) 06:58:49.78ID:M+BkbwUs
>>821
最初からそう言ってるだろ?
ブレるも何も、最初からそう言ってる



> 私の回答
> 短くまとめると、プライベートなメソッドのテストを書く必要は 無い と考えています。
>
> ほとんどのプライベートメソッドはパブリックメソッド経由でテストできるからです。プライベートメソッドは実装の詳細であり、自動テストのターゲットとなる「外部から見た振る舞い」ではありません。
2020/07/05(日) 07:00:51.32ID:M+BkbwUs
あ?まさかprivate関数の処理のテストをすればいいのに
private関数単独ででテストしなきゃだめだって思ってるのかw

あはは、関数単位でテストするのがユニットテストだって思ってるようだな
こりゃ、お・わ・ら・い・だw
2020/07/05(日) 07:02:37.00ID:BTTSshKd
メソッド単位でテストしろって言うのが組み込みおじさんだから話にならんよ
826デフォルトの名無しさん
垢版 |
2020/07/05(日) 07:03:05.56ID:9F15TCk0
なんだこいつ気持ち悪い。
827デフォルトの名無しさん
垢版 |
2020/07/05(日) 07:07:17.25ID:9F15TCk0
日本語もjavaも通じないからどうにもならない。
突然噛み付いてくる気持ちの悪いのは100%の確率でおかしいな。
2020/07/05(日) 07:08:18.45ID:M+BkbwUs
というふうに「技術」の話にレスができなくなったら
「人」(=俺)の話にすり替えるのが常套手段な
829デフォルトの名無しさん
垢版 |
2020/07/05(日) 07:13:21.25ID:9F15TCk0
というかお前は誰だよ。Private単位でコード書き換えてもやるって言ってる
人間がいたからPrivate単位では通常のビジネス系ではやらないという流れなのに
突然「お前は素人だあ!」とか噛み付いてきても知らんがな。

タブもスペースもトランケートされる2ちゃんでインデントがとかくだらない
ことでマウント取りにくる暇があったらまず日本語を学べ。

以上。
2020/07/05(日) 07:21:09.73ID:BTTSshKd
「privateメソッド」を直接テストしろって言う人はどうするのがいいって言うの?

a 全てprivateメソッドに対しても外部にリフレクション等を使用したテストを書くべき
b privateメソッドにアクセスできるクラスなどにpublicなテストコードを書くべき
c もっと言い方法がある、こうだ!
831デフォルトの名無しさん
垢版 |
2020/07/05(日) 07:22:11.60ID:LRfXHt7v
>>830
王家秘伝の技がある。
2020/07/05(日) 07:24:08.15ID:M+BkbwUs
>>830

>>798 じゃねーの?w

> 完ぺきにテストしたからといって製品の完全性を保証することはできません。
> したがってテストしないほうが良いのです。

つまり

privateにしたらテストできません。だからしないほうがいいのです。
完璧にテストした所で落ちない飛行機はありません
したがってテストしないほうがいいのです
833デフォルトの名無しさん
垢版 |
2020/07/05(日) 07:24:58.59ID:9F15TCk0
しかしよくチンコのサイズテストwにマジで噛みつけるもんだ。
2020/07/05(日) 07:29:06.68ID:M+BkbwUs
>>833
あ、そういうテストだったの?w
コードしか見てないよw
2020/07/05(日) 07:30:17.21ID:M+BkbwUs
Chinってちんこのことだったんだな
funcSとかfuncBとかfoo、barみたいに意味がない単語じゃん
コードがクソすぎて意味が伝わらないいい例だな
836デフォルトの名無しさん
垢版 |
2020/07/05(日) 07:34:08.81ID:9F15TCk0
無い場合You are a womanで9以下なら小さい、16越えりゃWow!で名前が
チンテスターなんだからわかってる人間は多いだろうな。
2020/07/05(日) 07:36:44.58ID:M+BkbwUs
>>836
じゃあint型の配列のlen(長さ)ってどういうこと?
配列がnullなら女で配列が複数あれば男?
何が複数なの?
838デフォルトの名無しさん
垢版 |
2020/07/05(日) 07:36:59.87ID:9F15TCk0
ちなみにfuncなんとかというのは君の好きなグーグルあたりでも例ではよく使うわな。
BとSもbigとsmallだろうと英語得意なら当たりがつくけどね。なぜABじゃなくてBS
なのか。そもそもoutに出てんだし。
839デフォルトの名無しさん
垢版 |
2020/07/05(日) 07:38:39.33ID:9F15TCk0
>>837
行があればChinkoクラスを作るとこだがスペースいらないで
intじゃなくてヌルポが出るものがarrayだからそれの長さで表してるだけだよ。
2020/07/05(日) 07:44:01.87ID:M+BkbwUs
> intじゃなくてヌルポが出るものがarrayだから
・・・

Java知らんのか?整数かつオブジェクトでも使えばいいじゃないか
具体的には教えてやらんよ。自分で勉強しな
2020/07/05(日) 07:46:53.71ID:wXNAUX4A
privateメソッドだからテストしないとか言ってるやつはキチガイ
早く死んでね
2020/07/05(日) 07:49:38.56ID:y7MN16M9
>>824
いや、やってもいいだろ
お前がやりたくないのは「たまたま」VisualStudioでやりにくいってだけの理由だろ
早く死んでね
2020/07/05(日) 07:53:17.11ID:M+BkbwUs
こういう事やって、NULLチェックが4倍に増えたー、テストも増えたーって
言ってるやつがいるなんて驚き。馬鹿かとw 以下擬似コードな

public func(value) {
 // valueのNULLチェック
 処理
 処理
 処理
}

public func(value) {
 // valueのNULLチェック
 foo(value);
 bar(value);
 baz(value);
}
private foo(value) {
 // valueのNULLチェック
 処理1
}
private bar(value) {
 // valueのNULLチェック
 処理2
}
private baz(value) {
 // valueのNULLチェック
 処理3
}
844デフォルトの名無しさん
垢版 |
2020/07/05(日) 07:56:16.74ID:LRfXHt7v
プロは俺だけだったか。
2020/07/05(日) 08:03:19.96ID:FjEgCO9/
そもそもprivateメソッドだからテストしないとか言ってるキチガイにまともな返答なんかいらない

そんなのどこの職場でも認められるわけないから
publicメソッド通したprivateメソッドに自分が想定したケースの値が全部入る保証なんかない
ある特定のケースのみそのメソッドの処理が欲しいときにしか呼んでないことあるだろ
つまりメソッド自体のテストはできてないしその方法でコードカバレッジ100%は無理だし
そもそもpublicから呼び出したprivateのコードカバレッジを100%にするなんて
作業が狂気過ぎてまともな脳みそ持ってるやつならやる前に無駄って理解できる

バカは早く死んでね
2020/07/05(日) 08:06:02.24ID:M+BkbwUs
そもそもprivateメソッドだからテストしないとか言ってるキチガイには
この言葉を授けよう

t-wadaのブログ
https://t-wada.hatenablog.jp/entry/should-we-test-private-methods#%E3%83%91%E3%83%96%E3%83%AA%E3%83%83%E3%82%AF%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E7%B5%8C%E7%94%B1%E3%81%A7%E3%83%86%E3%82%B9%E3%83%88%E3%81%99%E3%82%8B


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

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

ただし、この議論にはプロダクトコードもテストコードも自分で書いていることという前提があります。プロダクトコードに手を入れられず、テストコードも無いレガシーコードに対しては、リフレクションは強力な手段です。

プライベートなメソッドのテストに関しては、4つの考え方があります。

パブリックメソッド経由でテストする
別クラスのパブリックメソッドとする
テスト対象の可視性を(やや)上げる
プライベートのまま、リフレクションでアクセスしてテストを書く
パブリックメソッド経由でテストする
多くの場合、そのクラスのパブリックメソッド経由でプライベートメソッドのテストも同時に行えます。テストできているか不安があるならテストカバレッジを確認しましょう。
2020/07/05(日) 08:10:31.93ID:FjEgCO9/
>>846
そいつプロジェクトで仕事したことあるのか怪しい部類じゃね?
2020/07/05(日) 08:16:36.05ID:IUsMolpf
publicを通した範囲でしかできないprivateのテストは網羅されてなく
メソッドの単体テストとして十分なテストは行われていません
あなたの意見は採用できません
できれば実際のプロジェクトを5つぐらい経験されてはいかがでしょうか?
849デフォルトの名無しさん
垢版 |
2020/07/05(日) 08:25:21.85ID:9F15TCk0
public通したprivateは単体としては怪しいというのはその通りだけど、
そもそも呼ばれないprivateを書くバカはいないわけで、条件があるから
書いてんだよね。で、条件をpublicの段階でテストするわけだから
ほぼ通ってるわけだよ。

上のチンコテストだとnullから16まで流せば全部通る。

違いは、上の例でprivateにnull突っ込んだらヌルポだわな。そこをテストするのは
コード変えなきゃいけないし、OOの大規模ビジネスソフトではそういうことは
やらない。それをやらなきゃいけない環境なら関数型でもいけるはず。
2020/07/05(日) 08:31:48.84ID:ckfZDtdO
>>849
できない時点でこの話は終わりさ
やらないわけには行かないんだから
90%できてても残り10%をどうやってもやる方法がないんだから
その方法はどうやっても採用できないし
わざわざする理由もない
別の方法ではできるんだから
851デフォルトの名無しさん
垢版 |
2020/07/05(日) 08:33:02.53ID:9F15TCk0
>>840
君のがpublic privateに関しては言ってることは正しいんだが
底抜けのバカだなあ。

整数かつオブジェクトwこのレベルの人と話してたのかw

はあ。。。

なんかいやになっちゃった。
852デフォルトの名無しさん
垢版 |
2020/07/05(日) 08:35:22.60ID:9F15TCk0
>>850
いやだから16まで流せば全部できてるけど。

ビジネス系ではやらないよ。組み込みで全部
テストしなきゃいけないというならわかるので
すれば良い。ただOOの手法とは違う。

デベロッパー千人のところでやってるの?
やってないでしょ?
2020/07/05(日) 09:13:35.35ID:iCbhqS6F
通ってればいいっていうなら単体テスト全否定だろw
結合テストなりで全部やりゃいいって話になる。
854デフォルトの名無しさん
垢版 |
2020/07/05(日) 09:23:53.74ID:9F15TCk0
>>853
だからその線引きをどこでやるのかっていう事で、
privateまで全部テストケース書いてエッジケースもネガティブも
全部やるなら関数型で良いんだよ。

別にバカにする気は無いし、関数型のが難しい場面もたくさんあるが、
大規模(デベロッパーだけで数百人)のOOプロジェクトやった事ある?
855デフォルトの名無しさん
垢版 |
2020/07/05(日) 09:30:39.94ID:9F15TCk0
上のチンコの例で言えば、funcSとfuncBのテストをテストケース書いて
コードを書き換えた上でやってドキュメントなりログなりで残すの?

だったらpublicでやれば良いし、そうやってpublicにするなら関数型でも
おんなじ事でしょ。

チンコがnullなのか16以上そこそこでかいのかまでしか関係ないわけで
privateがnullをハンドリングしてないとか無駄なんだよ。もちろん
命に関わるようなところではそれくらいの厳格さが求められる場合も
あるだろうが、普通のビジネスソフトではそこまでやらない。

他のチームが関わる場所を少なくするためにカプセル化するわけで、
そんな全部publicにしたら意味ないんだよ。
856デフォルトの名無しさん
垢版 |
2020/07/05(日) 09:41:54.39ID:LRfXHt7v
弊社はC2カバレッジ100%未満は出荷できませんけどね。
2020/07/05(日) 09:42:35.87ID:j0cUMVMZ
>>854
線引じゃねーよクソ野郎
publicでたまたま呼ばれた1パターンと
privateの網羅テストが同じになってたまるかアホかよ
クラスのなかにあるのでpublicから呼ばれたときだけ動けば
ルーチンとして不出来でもOKなんてあるわけないだろ
お前はクソだからもう死ねよ
858デフォルトの名無しさん
垢版 |
2020/07/05(日) 09:45:43.25ID:9F15TCk0
>>857
まあじゃあ君はprivateまでテストケース書いてやっとけば良いんじゃない?
誰も止めてないし。大規模ビジネスソフトでは世界的に言って普通ではないというだけで。

僕はあんまり関わることのないレベルの世界だけど、まあ多分一生関わらないので
君が良いならそれで良いと思うよ。
2020/07/05(日) 09:51:39.34ID:BTTSshKd
>>857
君は大変なんだねwテストがんばれーwww
2020/07/05(日) 09:54:43.54ID:bzHIXl0a
>>858
落としどころとしてはそんなところで良いんじゃね?
問題なのは「privateはテストするべきではない」なんて変な教義を押しつける人の方なんで。
861デフォルトの名無しさん
垢版 |
2020/07/05(日) 10:02:55.49ID:9F15TCk0
>>856
正直QAやってたのは随分前の話だから最近のQAツールは知らんけど、
privateが全部通ってれば100%なわけで、そもそもprivateがある理由は
使われるためなんだから普通は誰も一回も使ってない場合なんかはないわな。
レベルが高くなると通らないケースも出るだろうが。だから線引きってこと。

チンコテストならnullから16までやれば100%通ってる。privateかpublicかって
のは関係ない。ただしprivateはnullをハンドリングしてない。それをどうするかって話。
2020/07/05(日) 10:03:22.77ID:iCbhqS6F
>>854
お前こそ大規模プロジェクトやったことないだろw
それだけ大規模だと逆にテストコード書かんわ(nttデータとかアクセンチュアとかな)
そんなクソプロジェクトを引き合いに出されても知らんわw
863デフォルトの名無しさん
垢版 |
2020/07/05(日) 10:05:36.79ID:9F15TCk0
>>860
「べきでは無い」とは思わないけど、privateをデベロッパーの個人的な
チェックを超えてテストすることを求められるとしたら、何かプロジェクト的に
おかしいとは思う。
864デフォルトの名無しさん
垢版 |
2020/07/05(日) 10:08:05.85ID:9F15TCk0
>>862
だから僕もNTTデータとかは知らんと上に書いてるけれども。

アメリカの大規模ソフトは中の人だし、他の会社のデベロッパも何人も知ってるので、
実際にアメリカの業界は知ってる。

君の「クソブロジェクト」ではないプロジェクトは会社名は出す必要はないが
例えばアメリカのERPとかそのレベルでなんなの?
865デフォルトの名無しさん
垢版 |
2020/07/05(日) 10:09:56.64ID:9F15TCk0
だいたい質問を質問で返す人は答えるのに不都合がある人。

数百人のデベロッパーのプロジェクトをやったことなくても全く問題は
ないんだが(ロッキードのミサイルの制御の人とか数百人もいないし)、
「あるよ」とは帰ってこない。
2020/07/05(日) 10:15:56.23ID:bzHIXl0a
>>863
だからそれは別の話なんだからさ。
「privateなら必ずしも単体テストする必要はないけどやりたいならやれば?」
これでいいじゃん。
867デフォルトの名無しさん
垢版 |
2020/07/05(日) 10:19:00.51ID:9F15TCk0
>>866
ちょっと弱いかな。「普通はやらんけどやりたかったりやる必要があるならやれば?」

くらい?privateを全部テストケース書いてエッジやネガティブやるとなると多くの場合
サグラダファミリアになるし、普通はやらない。

でもやりたいならやれば良いとは思うのでだいたいそういう感じか。
2020/07/05(日) 10:31:49.01ID:BTTSshKd
組み込みおじさんはそこに義務感を感じ、他者に強要するのだろう
難儀なこった
869デフォルトの名無しさん
垢版 |
2020/07/05(日) 10:37:41.26ID:9F15TCk0
組み込みとかだと多くの場合そもそもOOあんまりいらんと思うのよね。

人工呼吸器の制御とかだときびしくやらないといけないのはわかるし、
やってない人工呼吸器とか俺も付けられたくないけどさw

OOのメソッドとかはちょっと違う話だわな。カプセル化とかは数百人になると
生きてくる。個人的には自分一人の個人プロジェクトでも使うけど。
数年後にまたやる羽目になったりした時に楽なので。
870デフォルトの名無しさん
垢版 |
2020/07/05(日) 10:45:19.20ID:MQ9nuMmc
>>847
それは僕も思ってた
机上の空論っぽいんだよね
2020/07/05(日) 10:53:33.35ID:kFjTOHVy
>>867
どこに差があるのかよくわからんが、どちらにしても一行目は問題ないにしても
二行目はここに存在しない敵を攻撃している印象。
いちいち関係ない話を絡めなくてもいいじゃんと思うが、二度も書くということは
そっちが主張したい本音ということかな?
2020/07/05(日) 10:55:30.48ID:sn+7aSX4
OOPは理解している人とOOPを理解していない人が単体テストについて不毛な争いをするスレかな?
873デフォルトの名無しさん
垢版 |
2020/07/05(日) 10:58:45.46ID:9F15TCk0
>>871
いや、元々がpublicじゃなくてprivate単位でやれという話からなんだからその話だよ。

publicでprivateの分岐通ってるなら良いじゃんといなら誰も否定していないのでは?

逆にprivateで一度も通ってない部分があっても良いじゃんとも言っていないような。
if文書くのに絶対通らない物を書く人いるわけないでしょw

ただ、公式なテストとして、privateのレベルでテストケース書いてログ残してコード
書き換えてコンパイルし直してやるというのは少なくとも普通のビジネスのソフトとしては
一般的なベストプラクティスではないし普通はアメリカの大手一流ではやらないということ。
例外はあるとしても。
874デフォルトの名無しさん
垢版 |
2020/07/05(日) 11:03:24.23ID:LRfXHt7v
土台が腐ってたら。
全部検査するほうが楽。
875デフォルトの名無しさん
垢版 |
2020/07/05(日) 11:04:34.60ID:9F15TCk0
幸いそういうのには当たったことはないw
上に書いたように例外は認める。
876デフォルトの名無しさん
垢版 |
2020/07/05(日) 11:09:23.64ID:MQ9nuMmc
アメリカの大手一流ってどこだろ?
877デフォルトの名無しさん
垢版 |
2020/07/05(日) 11:11:04.89ID:MQ9nuMmc
アメリカや大手や一流が正しいとは限らないけどね
ボーイングの飛行機があんなことになってるように
2020/07/05(日) 11:11:13.65ID:9F15TCk0
まあ会社的にはプログラマなら全員知ってるとこ。それ以上は言わん。
879デフォルトの名無しさん
垢版 |
2020/07/05(日) 11:13:19.35ID:9F15TCk0
>>877
だからボーイングの制御系とかはそもそも全然別の話。

もちろん正しいとは限らないけど標準なのは確かだわな。
日本初のOOより優れたこういうメソッドがある!というなら
もちろん喜んで聞くけどね。
2020/07/05(日) 11:14:37.74ID:kFjTOHVy
>いや、元々がpublicじゃなくてprivate単位でやれという話からなんだからその話だよ。
>ublicでprivateの分岐通ってるなら良いじゃんといなら誰も否定していないのでは?

そう、それが一致しているならいちいち関係ない話を絡めなくてもいいんでは?
public経由のテストで十分網羅できるのにそれでもprivateメソッド単位のテストが
必要なんて主張している人いたかな?そこに誤解があるんじゃないの?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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