カプセル化(英語: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)
カプセル化の有害性、オブジェクト指向は愚かな考え
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2020/06/18(木) 23:47:36.69ID:l/2SQUll558デフォルトの名無しさん
2020/07/03(金) 13:48:21.04ID:BB9T+E2r559デフォルトの名無しさん
2020/07/03(金) 14:48:27.68ID:lDWf2b6S560デフォルトの名無しさん
2020/07/03(金) 15:31:34.78ID:/F47has6 >>525
もしかして 神オブジェクト?
もしかして 神オブジェクト?
561デフォルトの名無しさん
2020/07/03(金) 15:33:00.38ID:/F47has6 よく見たら全部privateか。
...いや、そんなの誰が呼ぶんだ。
...いや、そんなの誰が呼ぶんだ。
562デフォルトの名無しさん
2020/07/03(金) 15:36:50.41ID:FAOrvW1R しらんがな、言ったやつがコードサンプルでも出さなきゃ説明力足りてないから分からんだろ
外部クラスがどうのとか言ってるやつもな。Javaの外部内部の関係も理解が曖昧なんだろ
外部クラスがどうのとか言ってるやつもな。Javaの外部内部の関係も理解が曖昧なんだろ
563デフォルトの名無しさん
2020/07/03(金) 16:46:44.22ID:q5wbDGG6 Javaって修飾子付けないとpackage privateがデフォルトだからその事言ってんじゃね?
package privateとは言い換えればpakage内publicと同じだから
package privateとは言い換えればpakage内publicと同じだから
564デフォルトの名無しさん
2020/07/03(金) 16:51:38.12ID:36TwtcUk じゃあpimplで。
565デフォルトの名無しさん
2020/07/03(金) 16:55:37.72ID:hDsckVNf566デフォルトの名無しさん
2020/07/03(金) 16:58:29.95ID:36TwtcUk 弊社はC2カバレッジ100%に満たないものは出荷できませんけどね。
567デフォルトの名無しさん
2020/07/03(金) 17:19:33.24ID:Gy+Up1+B c2の100%は分野次第だがwebや基幹程度なら無駄と欺瞞で逆に信用できない
568デフォルトの名無しさん
2020/07/03(金) 17:47:09.01ID:DQKehNsV それな
569デフォルトの名無しさん
2020/07/03(金) 19:19:16.44ID:TUVANe+h >>566
普通そうだよね
普通そうだよね
570デフォルトの名無しさん
2020/07/03(金) 19:53:44.94ID:FArQoHTp 特に組み込みはC2カバレッジが常識なんだけど、ISO26262では関数カバレッジでOKという不思議。
571デフォルトの名無しさん
2020/07/03(金) 20:32:31.27ID:Gy+Up1+B572デフォルトの名無しさん
2020/07/03(金) 21:06:04.59ID:DQKehNsV あー、ここ組み込みとかのやつらが多いのか!納得だわ
573デフォルトの名無しさん
2020/07/04(土) 03:14:27.24ID:1AXxY7r6 >>559
そりゃインナークラスは親クラスのメンバーなんだから
親クラスから見えるのは当たり前。
巨大クラスを作ってその中にインナークラスが大量にあるような
コードならそれはカプセル化できてない。Java使ったから自動的に
カプセル化できるものでも適切なOOの設計になるわけでもない。
それらがやりやすいような言語なだけ。
適切に使えば、インナークラスを使わなかった場合パブリックで
メンバーにアクセスさせなければいけないのに対して、インナークラスの
メンバーはアウタークラス以外には見えないわけだから、よりカプセル化は
進んでいる。
そりゃインナークラスは親クラスのメンバーなんだから
親クラスから見えるのは当たり前。
巨大クラスを作ってその中にインナークラスが大量にあるような
コードならそれはカプセル化できてない。Java使ったから自動的に
カプセル化できるものでも適切なOOの設計になるわけでもない。
それらがやりやすいような言語なだけ。
適切に使えば、インナークラスを使わなかった場合パブリックで
メンバーにアクセスさせなければいけないのに対して、インナークラスの
メンバーはアウタークラス以外には見えないわけだから、よりカプセル化は
進んでいる。
574デフォルトの名無しさん
2020/07/04(土) 03:31:41.97ID:1AXxY7r6 親クラスは不適切だった。インナークラスはアウタークラスのメンバーなんだから
メンバーを見られるのは当たり前。
メンバーを見られるのは当たり前。
575デフォルトの名無しさん
2020/07/04(土) 08:51:34.07ID:+L2cGNSv >>572
組み込み開発やってるけど、ちゃんと最先端の勉強をしている人はオブジェクト指向理解しているよ(別にOOP自体は普及しきったノウハウだが)。
言語はC/C++言語ほぼ一択だけど。(他はRustくらいだが、まだ普及しない)
まぁ、WEBやアプリ開発等、我々から見て抽象レイヤーで使われるノウハウを軽視するおじさん上司も多いし、組み込みに残念なプログラマーが多いことは否定しないけど。
組み込み開発やってるけど、ちゃんと最先端の勉強をしている人はオブジェクト指向理解しているよ(別にOOP自体は普及しきったノウハウだが)。
言語はC/C++言語ほぼ一択だけど。(他はRustくらいだが、まだ普及しない)
まぁ、WEBやアプリ開発等、我々から見て抽象レイヤーで使われるノウハウを軽視するおじさん上司も多いし、組み込みに残念なプログラマーが多いことは否定しないけど。
576デフォルトの名無しさん
2020/07/04(土) 09:02:21.50ID:+L2cGNSv577デフォルトの名無しさん
2020/07/04(土) 10:13:15.22ID:6t8LAACC578デフォルトの名無しさん
2020/07/04(土) 10:19:47.88ID:+L2cGNSv 話の流れからして、テストのためにpublicにしろに読み取れたけど、ミスリード?
まぁ、そんな馬鹿な話、あるわけねーか。
まぁ、そんな馬鹿な話、あるわけねーか。
579デフォルトの名無しさん
2020/07/04(土) 10:30:23.87ID:xLCX+W2/580デフォルトの名無しさん
2020/07/04(土) 10:45:14.19ID:MjvraXl0 草、どんな立場だよw
581デフォルトの名無しさん
2020/07/04(土) 11:02:29.17ID:pmIasW6W publicにしなくてもリフレクション使ったりすればええんやで
privateだからテストしないなんてプログラマとしてありえない
privateだからテストしないなんてプログラマとしてありえない
582デフォルトの名無しさん
2020/07/04(土) 11:03:03.13ID:pmIasW6W C2 100%は新人でも最低ライン
583デフォルトの名無しさん
2020/07/04(土) 11:06:53.34ID:pmIasW6W テストの仕方を知らない教えない会社があるんだなー
584デフォルトの名無しさん
2020/07/04(土) 11:08:56.73ID:M3d71N9d >>576
> カバレッジテストとアクセス修飾子って関係あるの?
当然関係ないよ。(ここらへんで関係があるとか言ってるのはアホからだ無視していい。)
privateになってようが、それはpublic経由でテストするのだから
カバレッジは変わらない
テストのしやすさが変わるだけ。もしprivateのままだとテストしづらいなら
そのprivateの仕様を明確にしてpublicにして問題ないような設計に変えるだけのこと
> カバレッジテストとアクセス修飾子って関係あるの?
当然関係ないよ。(ここらへんで関係があるとか言ってるのはアホからだ無視していい。)
privateになってようが、それはpublic経由でテストするのだから
カバレッジは変わらない
テストのしやすさが変わるだけ。もしprivateのままだとテストしづらいなら
そのprivateの仕様を明確にしてpublicにして問題ないような設計に変えるだけのこと
585デフォルトの名無しさん
2020/07/04(土) 11:13:54.87ID:pmIasW6W >>584
publicにしないとテストできないってどんな言語?
privateのままテストしたらええやんけ
unit testは最小単位でテストすることでテストのコストを
最小化するものだからpublic経由でprivateなメソッド呼び出してたら
unit testの意味をわかってないアホの極みだしテストのためだけにpublicにするよう
設計に手をいれるのは本末転倒
publicにしないとテストできないってどんな言語?
privateのままテストしたらええやんけ
unit testは最小単位でテストすることでテストのコストを
最小化するものだからpublic経由でprivateなメソッド呼び出してたら
unit testの意味をわかってないアホの極みだしテストのためだけにpublicにするよう
設計に手をいれるのは本末転倒
586デフォルトの名無しさん
2020/07/04(土) 11:14:51.95ID:9ghyGMpS とある大手家電メーカー勤めだが、以前までC2カバレッジ必須でやってたんだけど、色々な計測の結果じつはユニットテストでカバレッジに時間かけるよりシステムテストに時間かけたほうが品質が上がるという結果が出てからはユニットテスト必須じゃなくなったわ。
587デフォルトの名無しさん
2020/07/04(土) 11:14:53.14ID:pmIasW6W テストの仕方って教えないものなんだなー
588デフォルトの名無しさん
2020/07/04(土) 11:16:50.57ID:M3d71N9d 外部から使うかどうかという(間違った)考え方で
privateにするかpublicにするかを決めてると
例えば、全文検索エンジンなんか最低限
文書の登録メソッドregisterと検索メソッドsearchだけでいいってことになってしまう
しかし全文検索エンジンとかいうのは内部で
高速なデータ検索を行うためにいろんなアルゴリズムやデータ構造を
使っているわけで、それらを(実際に使用例ができるかどうかは別として)
汎用的に使えるようにライブラリとして分離すればいいわけ
privateにするかpublicにするかっていうのは、そのシステムで外部から使うか?ではなくて
オブジェクトとして外部から使うかなわけで、privateでテストしづらいようなものは
別オブジェクトに分離とするとか設計をみなすべきってことなんだよ
privateにするかpublicにするかを決めてると
例えば、全文検索エンジンなんか最低限
文書の登録メソッドregisterと検索メソッドsearchだけでいいってことになってしまう
しかし全文検索エンジンとかいうのは内部で
高速なデータ検索を行うためにいろんなアルゴリズムやデータ構造を
使っているわけで、それらを(実際に使用例ができるかどうかは別として)
汎用的に使えるようにライブラリとして分離すればいいわけ
privateにするかpublicにするかっていうのは、そのシステムで外部から使うか?ではなくて
オブジェクトとして外部から使うかなわけで、privateでテストしづらいようなものは
別オブジェクトに分離とするとか設計をみなすべきってことなんだよ
589デフォルトの名無しさん
2020/07/04(土) 11:18:52.84ID:pmIasW6W590デフォルトの名無しさん
2020/07/04(土) 11:18:58.30ID:M3d71N9d >>585
> publicにしないとテストできないってどんな言語?
そんな話はしてない
可能不可能な話はしていない
やりやすいかどうかの話をしている
コストを考えなきゃいかんよ?
できるけど大変っていうのは、問題を何も解決してない
ちゃんと設計をせずに関数のインターフェースを定義せずに
無理やりprivateのテストをしても、private=外部から使わない=変更しても問題ないわけで
それに対してテストをしていると、変更しても問題ないはずのprivateメソッドを変更したら
テストが失敗するってことになるのでよくない
> publicにしないとテストできないってどんな言語?
そんな話はしてない
可能不可能な話はしていない
やりやすいかどうかの話をしている
コストを考えなきゃいかんよ?
できるけど大変っていうのは、問題を何も解決してない
ちゃんと設計をせずに関数のインターフェースを定義せずに
無理やりprivateのテストをしても、private=外部から使わない=変更しても問題ないわけで
それに対してテストをしていると、変更しても問題ないはずのprivateメソッドを変更したら
テストが失敗するってことになるのでよくない
591デフォルトの名無しさん
2020/07/04(土) 11:20:06.42ID:M3d71N9d592デフォルトの名無しさん
2020/07/04(土) 11:23:05.84ID:pmIasW6W >>590
privateでテストできないならpublicに設計し直すんやって言ってたじゃん
privateのままでテストするのに何も大変なことなんてない
テストのためだけに設計し直すのは頭おかしい
テストされてないメソッドが存在する方が問題だよ
外部から使わないから問題ないよねって感覚で勝手に修正されるわけないだろw
メソッド書き換えたらテストも修正するのは当たり前
privateでテストできないならpublicに設計し直すんやって言ってたじゃん
privateのままでテストするのに何も大変なことなんてない
テストのためだけに設計し直すのは頭おかしい
テストされてないメソッドが存在する方が問題だよ
外部から使わないから問題ないよねって感覚で勝手に修正されるわけないだろw
メソッド書き換えたらテストも修正するのは当たり前
593デフォルトの名無しさん
2020/07/04(土) 11:24:25.01ID:pmIasW6W594デフォルトの名無しさん
2020/07/04(土) 11:26:55.62ID:pmIasW6W privateなメソッドであっても事前条件も事後条件もある
unit testでカバーしてれば壊れてないことを確認できるからリファクタリングが可能になる
unit testでカバーしてれば壊れてないことを確認できるからリファクタリングが可能になる
595デフォルトの名無しさん
2020/07/04(土) 11:27:43.00ID:1AXxY7r6 大規模システムでずっと来てるけどカバレッジって初めて聞いた。調べたら
アメリカだと航空宇宙とか自動車とかでやるみたいね。
ERPで分岐ごとにやってたら多分完成まで数世紀かかるよw
privateとかpublicとかは単に現場次第だよね。正式なQAメソッドではそこまで
言わないし、どうでもいいというか、臨機応変にやるとこ。
アメリカだと航空宇宙とか自動車とかでやるみたいね。
ERPで分岐ごとにやってたら多分完成まで数世紀かかるよw
privateとかpublicとかは単に現場次第だよね。正式なQAメソッドではそこまで
言わないし、どうでもいいというか、臨機応変にやるとこ。
596デフォルトの名無しさん
2020/07/04(土) 11:30:38.80ID:pmIasW6W >>595
臨機応変にやるのは会社を首にならないためですよねw
それは社会をどうやって生き抜いていくかサラリーマンとしての心得じゃないですか
プログラマとして品質の高いプログラムを作るためにC2 100%は最低条件ですよ
臨機応変にやるのは会社を首にならないためですよねw
それは社会をどうやって生き抜いていくかサラリーマンとしての心得じゃないですか
プログラマとして品質の高いプログラムを作るためにC2 100%は最低条件ですよ
597デフォルトの名無しさん
2020/07/04(土) 11:33:41.81ID:1AXxY7r6598デフォルトの名無しさん
2020/07/04(土) 11:36:02.68ID:1AXxY7r6 ちなみに臨機応変にやるとこなのは会社首とかはどうでもよくて、
ユニットテストはなに、リグレッションは、アクセプタンスはってのは
QAのメソッドとして確立してるけど、JavaのPrivateがどうするかみたいなのは
完全に現場次第だから。
世界標準はないでしょ。
ユニットテストはなに、リグレッションは、アクセプタンスはってのは
QAのメソッドとして確立してるけど、JavaのPrivateがどうするかみたいなのは
完全に現場次第だから。
世界標準はないでしょ。
599デフォルトの名無しさん
2020/07/04(土) 11:39:33.69ID:pmIasW6W >>597
大規模システムってみずほとか?
テストは組み合わせを考えると膨大になるのだけれども
最小単位のunit testだとそうでもなくてだからこそunit testは大事なんよ
Salesforceは知ってる?クラウド型のサービスでアプリ作ったりできるんだけど
カバレッジが75%以下だとデプロイできなくなってる
大規模だからビジネスシステムだからテストしなくていいはちょっと今の時代ありえない
大規模システムってみずほとか?
テストは組み合わせを考えると膨大になるのだけれども
最小単位のunit testだとそうでもなくてだからこそunit testは大事なんよ
Salesforceは知ってる?クラウド型のサービスでアプリ作ったりできるんだけど
カバレッジが75%以下だとデプロイできなくなってる
大規模だからビジネスシステムだからテストしなくていいはちょっと今の時代ありえない
600デフォルトの名無しさん
2020/07/04(土) 11:39:35.50ID:MJUVFEDB 昔の組み込みの少ない経験だけでイキってるんやろ
601デフォルトの名無しさん
2020/07/04(土) 11:40:52.54ID:M3d71N9d >>592
> privateでテストできないならpublicに設計し直すんやって言ってたじゃん
> privateのままでテストするのに何も大変なことなんてない
自分で答え言ってるじゃんw
privateでテストできないならpublicに設計し直すんだから
privateのテストは大変じゃなくて必要ないってこと
> privateでテストできないならpublicに設計し直すんやって言ってたじゃん
> privateのままでテストするのに何も大変なことなんてない
自分で答え言ってるじゃんw
privateでテストできないならpublicに設計し直すんだから
privateのテストは大変じゃなくて必要ないってこと
602デフォルトの名無しさん
2020/07/04(土) 11:41:39.32ID:M3d71N9d >>593
> わかってないのはそっちの方、unit testでカバーしてなかったら
> 仕様通り動いてるのを確認できない
ユニットテストでカバーしないなんて一言も言ってないんだが?
何に反論してるんだよ
> わかってないのはそっちの方、unit testでカバーしてなかったら
> 仕様通り動いてるのを確認できない
ユニットテストでカバーしないなんて一言も言ってないんだが?
何に反論してるんだよ
603デフォルトの名無しさん
2020/07/04(土) 11:41:45.39ID:pmIasW6W >>598
現場次第だから現場に従うんだっていうのはそれはサラリーマンとして生き残るために
そうせざるを得ないだけだよね、品質の高いプログラムを作るなら常にテストはしないといけない
世界標準がないからいんだっていうのじゃないよ
現場次第だから現場に従うんだっていうのはそれはサラリーマンとして生き残るために
そうせざるを得ないだけだよね、品質の高いプログラムを作るなら常にテストはしないといけない
世界標準がないからいんだっていうのじゃないよ
604デフォルトの名無しさん
2020/07/04(土) 11:42:23.92ID:M3d71N9d >>594
> privateなメソッドであっても事前条件も事後条件もある
> unit testでカバーしてれば壊れてないことを確認できるからリファクタリングが可能になる
最初からpublic経由でテストするって言ってるよね?
> privateなメソッドであっても事前条件も事後条件もある
> unit testでカバーしてれば壊れてないことを確認できるからリファクタリングが可能になる
最初からpublic経由でテストするって言ってるよね?
605デフォルトの名無しさん
2020/07/04(土) 11:43:01.27ID:czCytfqY あたい知ってるよ
カバレッジテストを合格するために、privateをpublicにしてメソッドを呼び出せばいいんだよね。
あたい知ってるよ
カバレッジテストを合格するために、メソッドの中に記載されている条件文全て消せばいいんだよね。
あたい知ってるよ
カバレッジテストを合格するために、メソッドの中に記載されているコードを全部消せばいいんだよね。
カバレッジテストを合格するために、privateをpublicにしてメソッドを呼び出せばいいんだよね。
あたい知ってるよ
カバレッジテストを合格するために、メソッドの中に記載されている条件文全て消せばいいんだよね。
あたい知ってるよ
カバレッジテストを合格するために、メソッドの中に記載されているコードを全部消せばいいんだよね。
606デフォルトの名無しさん
2020/07/04(土) 11:43:01.49ID:pmIasW6W607デフォルトの名無しさん
2020/07/04(土) 11:43:56.50ID:pmIasW6W608デフォルトの名無しさん
2020/07/04(土) 11:44:22.90ID:M3d71N9d >>606
> privateのテストは必要だよ
だから何度も言ってるがprivateでテストしたいと思ったら
publicに変更するんだから、privateのテストはしなくてすむと言ってる
お前短絡思考なんだよ。
privateはprivateのままテストしなくちゃいけないんだって思ってるだろ
> privateのテストは必要だよ
だから何度も言ってるがprivateでテストしたいと思ったら
publicに変更するんだから、privateのテストはしなくてすむと言ってる
お前短絡思考なんだよ。
privateはprivateのままテストしなくちゃいけないんだって思ってるだろ
609デフォルトの名無しさん
2020/07/04(土) 11:44:50.09ID:pmIasW6W610デフォルトの名無しさん
2020/07/04(土) 11:45:01.10ID:M3d71N9d >>607
> 君はprivateのテストは書かないってことだから
> privateのメソッドはunit testでカバーされてないよねってこと
なんですぐ上でprivateはpublic経由でテストするって言ってるのに
理解できてないの?
> 君はprivateのテストは書かないってことだから
> privateのメソッドはunit testでカバーされてないよねってこと
なんですぐ上でprivateはpublic経由でテストするって言ってるのに
理解できてないの?
611デフォルトの名無しさん
2020/07/04(土) 11:45:43.09ID:pmIasW6W612デフォルトの名無しさん
2020/07/04(土) 11:46:08.10ID:M3d71N9d >>609
> それはunit testにならないよってこと
> privateのメソッドをテストできてないよってこと
publicメソッド経由でテストしますがなにか?
publicメソッド経由でテストするのが大変なものは
設計を変更すべきなんだよ
> それはunit testにならないよってこと
> privateのメソッドをテストできてないよってこと
publicメソッド経由でテストしますがなにか?
publicメソッド経由でテストするのが大変なものは
設計を変更すべきなんだよ
613デフォルトの名無しさん
2020/07/04(土) 11:46:12.42ID:pmIasW6W >>610
public経由でのテストはunit testではないよってこと
public経由でのテストはunit testではないよってこと
614デフォルトの名無しさん
2020/07/04(土) 11:47:15.08ID:M3d71N9d >>611
> テストしたいからpublicにするのが間違ってて
> privateのままテストするのがオブジェクト指向として正当なやり方
だからprivateのままpublicメソッド経由でテストすりゃいいじゃん(笑)
何度も言ってる。
それが難しいなら、それはコードがすでに複雑である証拠なので
複雑なものを直さないでテストすると破綻する
> テストしたいからpublicにするのが間違ってて
> privateのままテストするのがオブジェクト指向として正当なやり方
だからprivateのままpublicメソッド経由でテストすりゃいいじゃん(笑)
何度も言ってる。
それが難しいなら、それはコードがすでに複雑である証拠なので
複雑なものを直さないでテストすると破綻する
615デフォルトの名無しさん
2020/07/04(土) 11:47:24.81ID:pmIasW6W616デフォルトの名無しさん
2020/07/04(土) 11:47:48.99ID:M3d71N9d617デフォルトの名無しさん
2020/07/04(土) 11:48:47.27ID:M3d71N9d >>615
> だからテストのためにオブジェクト変えてるのはprivateのテストを知らないだけだから
複雑だからオブジェクトを変えてるんだよ
アホなのか?
privateのテストはpublicメソッド経由でやる
それが難しいなら、コードが複雑だから設計を治す
> だからテストのためにオブジェクト変えてるのはprivateのテストを知らないだけだから
複雑だからオブジェクトを変えてるんだよ
アホなのか?
privateのテストはpublicメソッド経由でやる
それが難しいなら、コードが複雑だから設計を治す
618デフォルトの名無しさん
2020/07/04(土) 11:48:55.01ID:1AXxY7r6 >>599
アメリカの某有名パッケージだね。
その界隈では知ってる限りunit testでカバレージを求められることは無いし
GAFAあたりでも分岐ごとにやらないはず。エッジケースをどうするかとかは
聞かれるけど。
だいたいデベロッパーテストで全分岐をカバーしたところであまり意味はないし。
どのみちQAに回すわけで他人がやんなきゃ意味ない。
カバレージという概念を求められるのが少なくともアメリカでは航空宇宙や
自動車のようだし、良い悪いは別として、これが求められるようなところは
OOとかカプセル化とかが大事なプロジェクトとはちょっと違うよね。
千人のデベロッパーに五百人のテスターで組み込みとかやらないでしょ。
いや知らんのでイメージだけど。
アメリカの某有名パッケージだね。
その界隈では知ってる限りunit testでカバレージを求められることは無いし
GAFAあたりでも分岐ごとにやらないはず。エッジケースをどうするかとかは
聞かれるけど。
だいたいデベロッパーテストで全分岐をカバーしたところであまり意味はないし。
どのみちQAに回すわけで他人がやんなきゃ意味ない。
カバレージという概念を求められるのが少なくともアメリカでは航空宇宙や
自動車のようだし、良い悪いは別として、これが求められるようなところは
OOとかカプセル化とかが大事なプロジェクトとはちょっと違うよね。
千人のデベロッパーに五百人のテスターで組み込みとかやらないでしょ。
いや知らんのでイメージだけど。
619デフォルトの名無しさん
2020/07/04(土) 11:49:13.09ID:pmIasW6W620デフォルトの名無しさん
2020/07/04(土) 11:49:55.50ID:M3d71N9d621デフォルトの名無しさん
2020/07/04(土) 11:50:29.94ID:MJUVFEDB 誰のためにユニットテストするの?w
語ってるべき論は誰かを想定しちゃってない?w
語ってるべき論は誰かを想定しちゃってない?w
622デフォルトの名無しさん
2020/07/04(土) 11:50:46.08ID:pmIasW6W >>616
unit testは最小単位だから、世界共通の定義
publicを経由してたら内部でどんなにprivateなメソッドを呼び出しまくってても
unit testになるなんて、定義はどこにもないのでpublic経由はunit testに当てはまらない
unit testは最小単位だから、世界共通の定義
publicを経由してたら内部でどんなにprivateなメソッドを呼び出しまくってても
unit testになるなんて、定義はどこにもないのでpublic経由はunit testに当てはまらない
623デフォルトの名無しさん
2020/07/04(土) 11:51:29.32ID:MG3qPS+J 名前をつけるとpublicだろうがprivateだろうがテストしなきゃいけない
→つまり無名にしてその場で使い捨てればテストしなくてOK!
→つまり無名にしてその場で使い捨てればテストしなくてOK!
624デフォルトの名無しさん
2020/07/04(土) 11:51:49.54ID:M3d71N9d もう答えがすでに出てる話をまだづつても無意味なんだけどなw
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つの考え方があります。
パブリックメソッド経由でテストする
別クラスのパブリックメソッドとする
テスト対象の可視性を(やや)上げる
プライベートのまま、リフレクションでアクセスしてテストを書く
パブリックメソッド経由でテストする
多くの場合、そのクラスのパブリックメソッド経由でプライベートメソッドのテストも同時に行えます。テストできているか不安があるならテストカバレッジを確認しましょう。
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つの考え方があります。
パブリックメソッド経由でテストする
別クラスのパブリックメソッドとする
テスト対象の可視性を(やや)上げる
プライベートのまま、リフレクションでアクセスしてテストを書く
パブリックメソッド経由でテストする
多くの場合、そのクラスのパブリックメソッド経由でプライベートメソッドのテストも同時に行えます。テストできているか不安があるならテストカバレッジを確認しましょう。
625デフォルトの名無しさん
2020/07/04(土) 11:52:44.14ID:pmIasW6W >>617
privateのテストはprivateを直接テストしないとunit testにならないよ
privateのテストはprivateを直接テストしないとunit testにならないよ
626デフォルトの名無しさん
2020/07/04(土) 11:52:52.72ID:M3d71N9d >>622
> unit testは最小単位だから、世界共通の定義
> publicを経由してたら内部でどんなにprivateなメソッドを呼び出しまくってても
> unit testになるなんて、定義はどこにもないのでpublic経由はunit testに当てはまらない
それはお前の定義であって、なんの根拠もないことはわかってる
> unit testは最小単位だから、世界共通の定義
> publicを経由してたら内部でどんなにprivateなメソッドを呼び出しまくってても
> unit testになるなんて、定義はどこにもないのでpublic経由はunit testに当てはまらない
それはお前の定義であって、なんの根拠もないことはわかってる
627デフォルトの名無しさん
2020/07/04(土) 11:53:29.28ID:M3d71N9d628デフォルトの名無しさん
2020/07/04(土) 11:53:30.11ID:czCytfqY629デフォルトの名無しさん
2020/07/04(土) 11:53:42.19ID:pmIasW6W630デフォルトの名無しさん
2020/07/04(土) 11:54:47.69ID:pmIasW6W >>627
根拠は示したけどね、理解する気がないだけなんじゃない?
根拠は示したけどね、理解する気がないだけなんじゃない?
631デフォルトの名無しさん
2020/07/04(土) 11:54:52.11ID:M3d71N9d >>628
> テストのために、コード書き換えてどうするんだよってね。
お前の目的は、テストがしづらい複雑なコードを変えないことなの?(笑)
それともちゃんとテストが出来るコードを開発することなの?
どっちなのさ
目的を理解してるか?
> テストのために、コード書き換えてどうするんだよってね。
お前の目的は、テストがしづらい複雑なコードを変えないことなの?(笑)
それともちゃんとテストが出来るコードを開発することなの?
どっちなのさ
目的を理解してるか?
632デフォルトの名無しさん
2020/07/04(土) 11:55:05.15ID:MJUVFEDB 「メソッド単位のunit テストを強制されてるのです」ww
633デフォルトの名無しさん
2020/07/04(土) 11:55:51.40ID:M3d71N9d >>628
> 誰だよそれ、YouTuberか?
え? t-wadaさんを知らないってそれまずくね?w
https://twitter.com/t_wada
プログラマ。TDD 実践者。power-assert-js 作者。
『テスト駆動開発』『プログラマが知るべき97のこと』『SQLアンチパターン』を翻訳/監訳しました。
https://twitter.com/5chan_nel (5ch newer account)
> 誰だよそれ、YouTuberか?
え? t-wadaさんを知らないってそれまずくね?w
https://twitter.com/t_wada
プログラマ。TDD 実践者。power-assert-js 作者。
『テスト駆動開発』『プログラマが知るべき97のこと』『SQLアンチパターン』を翻訳/監訳しました。
https://twitter.com/5chan_nel (5ch newer account)
634デフォルトの名無しさん
2020/07/04(土) 11:56:33.70ID:M3d71N9d635デフォルトの名無しさん
2020/07/04(土) 11:56:48.02ID:pmIasW6W >>632
TDDとか知らないの?
TDDとか知らないの?
636デフォルトの名無しさん
2020/07/04(土) 11:57:31.94ID:czCytfqY >>631
おめーこそ、テストの目的を理解してんのか、カス。
privateが記述されているってことは、外部から呼び出したら駄目なメソッドだ。
それを外部から呼び出して単体テスト合格とかふざけんな。
テストなめてんだろ。
おめーこそ、テストの目的を理解してんのか、カス。
privateが記述されているってことは、外部から呼び出したら駄目なメソッドだ。
それを外部から呼び出して単体テスト合格とかふざけんな。
テストなめてんだろ。
637デフォルトの名無しさん
2020/07/04(土) 11:58:00.26ID:M3d71N9d >>635
TDDで有名な人の名前って知ってる?
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
https://twitter.com/t_wada
プログラマ。TDD 実践者。power-assert-js 作者。
『テスト駆動開発』『プログラマが知るべき97のこと』『SQLアンチパターン』を翻訳/監訳しました。
> 私の回答
> 短くまとめると、プライベートなメソッドのテストを書く必要は 無い と考えています。
>
> パブリックメソッド経由でテストする
https://twitter.com/5chan_nel (5ch newer account)
TDDで有名な人の名前って知ってる?
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
https://twitter.com/t_wada
プログラマ。TDD 実践者。power-assert-js 作者。
『テスト駆動開発』『プログラマが知るべき97のこと』『SQLアンチパターン』を翻訳/監訳しました。
> 私の回答
> 短くまとめると、プライベートなメソッドのテストを書く必要は 無い と考えています。
>
> パブリックメソッド経由でテストする
https://twitter.com/5chan_nel (5ch newer account)
638デフォルトの名無しさん
2020/07/04(土) 11:58:12.80ID:pmIasW6W639デフォルトの名無しさん
2020/07/04(土) 11:58:45.56ID:M3d71N9d >>636
> おめーこそ、テストの目的を理解してんのか、カス。
> privateが記述されているってことは、外部から呼び出したら駄目なメソッドだ。
↑それ(外部から呼び出したらだめだ!)はテストの目的じゃないよw
> おめーこそ、テストの目的を理解してんのか、カス。
> privateが記述されているってことは、外部から呼び出したら駄目なメソッドだ。
↑それ(外部から呼び出したらだめだ!)はテストの目的じゃないよw
640デフォルトの名無しさん
2020/07/04(土) 11:59:28.07ID:czCytfqY で、でたー!!!
有名人の権威に頼る詭弁!
流石、詭弁のプロッ!
有名人の権威に頼る詭弁!
流石、詭弁のプロッ!
641デフォルトの名無しさん
2020/07/04(土) 11:59:33.33ID:pmIasW6W642デフォルトの名無しさん
2020/07/04(土) 11:59:35.76ID:M3d71N9d643デフォルトの名無しさん
2020/07/04(土) 12:00:04.79ID:M3d71N9d >>641
つまりそういうこと。お前は「テスト技術」に興味がない
つまりそういうこと。お前は「テスト技術」に興味がない
644デフォルトの名無しさん
2020/07/04(土) 12:01:48.43ID:M3d71N9d なぜ日本でTDDの専門家といって一番目に出てくるような人を知らないで
テストの話について語っているのか?
勉強したら必ず何度も目にする名前だろうに
テストの話について語っているのか?
勉強したら必ず何度も目にする名前だろうに
645デフォルトの名無しさん
2020/07/04(土) 12:05:38.40ID:pmIasW6W >>643
僕は@t_wadaさんを知らないだけですよ
有名な人の名前を知ってるから自分はテスト技術に興味があって正しい知識を持ってるんだって思ってる?
論理を無視した権威による詭弁としか思えないし、それってただのマウンティングにしかならないんじゃないですか?
俺はt_wadaさんのこと知ってんだぞ!!おめーどーなっても知らねえからな!みたいな中卒ヤンキーのマインドを
お持ちなのはわかったけど、議論の向き先としてそっちで良いのって僕は思いましたよ
僕は@t_wadaさんを知らないだけですよ
有名な人の名前を知ってるから自分はテスト技術に興味があって正しい知識を持ってるんだって思ってる?
論理を無視した権威による詭弁としか思えないし、それってただのマウンティングにしかならないんじゃないですか?
俺はt_wadaさんのこと知ってんだぞ!!おめーどーなっても知らねえからな!みたいな中卒ヤンキーのマインドを
お持ちなのはわかったけど、議論の向き先としてそっちで良いのって僕は思いましたよ
646デフォルトの名無しさん
2020/07/04(土) 12:06:25.67ID:M3d71N9d > 僕は@t_wadaさんを知らないだけですよ
その意味がわかってないんだろ?
お前は勉強した必ず目にする名前を知らないって言ってるんだよ
つまり勉強したことがないってこと
その意味がわかってないんだろ?
お前は勉強した必ず目にする名前を知らないって言ってるんだよ
つまり勉強したことがないってこと
647デフォルトの名無しさん
2020/07/04(土) 12:07:22.80ID:XvIYAIJA いいんじゃね、全てのメソッドをテストしたけりゃすればw
ただそれを強制されてることが一般的だと思って奴がいるのは滑稽だなw
ただそれを強制されてることが一般的だと思って奴がいるのは滑稽だなw
648デフォルトの名無しさん
2020/07/04(土) 12:08:56.81ID:pmIasW6W >>646
人の名前覚えて悦に入る人の心境がわからないんだよなー
僕はプログラムのことにしか興味がないから
誰がそれを書いたのかよりも書いてある内容の方に興味がある
執筆者の名前を覚えて勉強した気になってるだけじゃないの?
人の名前覚えて悦に入る人の心境がわからないんだよなー
僕はプログラムのことにしか興味がないから
誰がそれを書いたのかよりも書いてある内容の方に興味がある
執筆者の名前を覚えて勉強した気になってるだけじゃないの?
649デフォルトの名無しさん
2020/07/04(土) 12:09:30.14ID:M3d71N9d パブリックメソッド経由でテストする
多くの場合、そのクラスのパブリックメソッド経由でプライベートメソッドのテストも同時に行えます。
テストできているか不安があるならテストカバレッジを確認しましょう。
別クラスのパブリックメソッドとする
プライベートなメソッドのテストを書きたいということは、実はテスト対象の責務が多すぎることを
示唆している場合があります。テストがどうしても書きたい場合は、その責務はテスト対象の
プライベートな振る舞いではなく、他の誰かのパブリックな振る舞いなのでしょう。テスト対象の
プライベートメソッドを「クラスの抽出」や「メソッド/関数の移動」を使って、テスト対象の
コラボレータのパブリックメソッドとして抽出し、普通にパブリックメソッドとしてテストしましょう。
テスト対象の可視性を(やや)上げる
例えば Java では、同一のパッケージからのみアクセスできる可視性があり(正式名称ではありませんが
「パッケージプライベート」と呼ばれます)、テストを同一パッケージに配置することでテストから
アクセスできるような設計を行うことがあります。(ただし、この質問の場合は JavaScript なので、この手段はとれません)
プライベートのまま、リフレクションでアクセスしてテストを書く
リフレクションは最後の手段であり、強力な手段でもあります。プロダクトコードに手を入れることが
できない状況や、レガシーコード(テストコードの無いコード)に対する「仕様化テスト(Characterization Test)」を
書いているような状況では、リフレクションは唯一の、かつ強力な手段になります。プライベートメソッドに
テストを書くことのデメリットを理解しつつ、黒魔術の強力さを堪能しましょう。
(ただし、この質問の場合は JavaScript なので、この手段はとれません。JavaScript は比較的緩い言語ですが、クロージャの情報隠蔽は非常に強固です)
まとめ
繰り返すと、プライベートなメソッドや関数をテストする必要は無いと考えています。プライベートなメソッドは、実装の詳細であるからです。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
多くの場合、そのクラスのパブリックメソッド経由でプライベートメソッドのテストも同時に行えます。
テストできているか不安があるならテストカバレッジを確認しましょう。
別クラスのパブリックメソッドとする
プライベートなメソッドのテストを書きたいということは、実はテスト対象の責務が多すぎることを
示唆している場合があります。テストがどうしても書きたい場合は、その責務はテスト対象の
プライベートな振る舞いではなく、他の誰かのパブリックな振る舞いなのでしょう。テスト対象の
プライベートメソッドを「クラスの抽出」や「メソッド/関数の移動」を使って、テスト対象の
コラボレータのパブリックメソッドとして抽出し、普通にパブリックメソッドとしてテストしましょう。
テスト対象の可視性を(やや)上げる
例えば Java では、同一のパッケージからのみアクセスできる可視性があり(正式名称ではありませんが
「パッケージプライベート」と呼ばれます)、テストを同一パッケージに配置することでテストから
アクセスできるような設計を行うことがあります。(ただし、この質問の場合は JavaScript なので、この手段はとれません)
プライベートのまま、リフレクションでアクセスしてテストを書く
リフレクションは最後の手段であり、強力な手段でもあります。プロダクトコードに手を入れることが
できない状況や、レガシーコード(テストコードの無いコード)に対する「仕様化テスト(Characterization Test)」を
書いているような状況では、リフレクションは唯一の、かつ強力な手段になります。プライベートメソッドに
テストを書くことのデメリットを理解しつつ、黒魔術の強力さを堪能しましょう。
(ただし、この質問の場合は JavaScript なので、この手段はとれません。JavaScript は比較的緩い言語ですが、クロージャの情報隠蔽は非常に強固です)
まとめ
繰り返すと、プライベートなメソッドや関数をテストする必要は無いと考えています。プライベートなメソッドは、実装の詳細であるからです。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
650デフォルトの名無しさん
2020/07/04(土) 12:10:37.41ID:M3d71N9d651デフォルトの名無しさん
2020/07/04(土) 12:14:01.28ID:pmIasW6W >>650
著作権法に違反してない? 大丈夫?
僕はt_wadaさんを知らないし、信奉する立場でもないので
t_wadaさんがそう言ってるからそうなんだと思うことはないよ
内容に興味があるっていうのは、書いてあることをそっくりそのまま
自分の考えにするということではなくて自分の経験や知識に照らし合わせて
自分の考えを持つってことだよ
僕はその文章を読んでprivateメソッドをテストするべきだと思った
著作権法に違反してない? 大丈夫?
僕はt_wadaさんを知らないし、信奉する立場でもないので
t_wadaさんがそう言ってるからそうなんだと思うことはないよ
内容に興味があるっていうのは、書いてあることをそっくりそのまま
自分の考えにするということではなくて自分の経験や知識に照らし合わせて
自分の考えを持つってことだよ
僕はその文章を読んでprivateメソッドをテストするべきだと思った
652デフォルトの名無しさん
2020/07/04(土) 12:15:48.22ID:M3d71N9d > 著作権法に違反してない? 大丈夫?
もはや技術の話に反論できなくなったか
引用の範囲で著作権は関係ないな(爆笑)
> 僕はt_wadaさんを知らないし、信奉する立場でもないので
あのさぁ、お前。「t_wadaを知らない」という人の話じゃなくて
その人が言った内容についての話をしろよ
もはや技術の話に反論できなくなったか
引用の範囲で著作権は関係ないな(爆笑)
> 僕はt_wadaさんを知らないし、信奉する立場でもないので
あのさぁ、お前。「t_wadaを知らない」という人の話じゃなくて
その人が言った内容についての話をしろよ
653デフォルトの名無しさん
2020/07/04(土) 12:16:19.37ID:M3d71N9d > 僕はその文章を読んでprivateメソッドをテストするべきだと思った
それはあなたの感想です。考えは何も述べていません。
それはあなたの感想です。考えは何も述べていません。
654デフォルトの名無しさん
2020/07/04(土) 12:18:15.28ID:czCytfqY >>639
> ↑それ(外部から呼び出したらだめだ!)はテストの目的じゃないよw
別に、デバッグ目的で一時的にprivateメソッドを呼びたいのなら、勝手に呼んでどうぞ。
だが、テスト工程...特に単体テストでprivateをpublicにするのはアウト。
本来、呼ばれないはずのprivateだったメソッドが呼ばれてしまえば、本来、不合格だったはずのカバレッジテストに合格してしまう可能性が出てくるし、privateメソッドを呼んだことで、本来ありえないクラス内部状態を作ってしまったら、単体テストの結果も変わってしまう。
テストは本番と同じ状態を保たないと駄目だよ。
プログラマーの開発工程におけるデバッグ及び動作確認とテストを混同させていないか?
> ↑それ(外部から呼び出したらだめだ!)はテストの目的じゃないよw
別に、デバッグ目的で一時的にprivateメソッドを呼びたいのなら、勝手に呼んでどうぞ。
だが、テスト工程...特に単体テストでprivateをpublicにするのはアウト。
本来、呼ばれないはずのprivateだったメソッドが呼ばれてしまえば、本来、不合格だったはずのカバレッジテストに合格してしまう可能性が出てくるし、privateメソッドを呼んだことで、本来ありえないクラス内部状態を作ってしまったら、単体テストの結果も変わってしまう。
テストは本番と同じ状態を保たないと駄目だよ。
プログラマーの開発工程におけるデバッグ及び動作確認とテストを混同させていないか?
655デフォルトの名無しさん
2020/07/04(土) 12:19:20.76ID:XvIYAIJA 最後の行ありそうw
656デフォルトの名無しさん
2020/07/04(土) 12:19:46.76ID:M3d71N9d >>654
> だが、テスト工程...特に単体テストでprivateをpublicにするのはアウト。
ウォーターフォール開発?
テストで問題が出ても問題を上流に戻したらだめって
バグが出ても直したらいかんのかよw
> だが、テスト工程...特に単体テストでprivateをpublicにするのはアウト。
ウォーターフォール開発?
テストで問題が出ても問題を上流に戻したらだめって
バグが出ても直したらいかんのかよw
657デフォルトの名無しさん
2020/07/04(土) 12:20:53.65ID:M3d71N9d >>654
> プログラマーの開発工程におけるデバッグ及び動作確認とテストを混同させていないか?
今はプログラマーの開発工程におけるデバッグの話ですよ?
動作確認でprivateメソッドを呼んでテストなんてしませんから
> プログラマーの開発工程におけるデバッグ及び動作確認とテストを混同させていないか?
今はプログラマーの開発工程におけるデバッグの話ですよ?
動作確認でprivateメソッドを呼んでテストなんてしませんから
■ このスレッドは過去ログ倉庫に格納されています
