X



オブジェクト指向って自然な文法だな 3 [無断転載禁止]©2ch.net
レス数が1000を超えています。これ以上書き込みはできません。
0003デフォルトの名無しさん垢版2017/04/02(日) 17:00:47.26ID:n7h/bBRg
モダンC言語プログラミング
http://ascii.asciimw.jp/books/books/detail/978-4-04-891309-6.shtml

統合開発環境、デザインパターン、エクストリーム・プログラミング、
テスト駆動開発、リファクタリング、継続的インテグレーションの活用

第3章 C言語とオブジェクト指向
3.1 概要
3.2 Cのモジュール化とオブジェクト指向
3.3 まとめ
第4章 C言語とデザインパターン
4.1 ステートパターン(State)
4.2 テンプレートメソッドパターン(Template)
4.3 オブザーバパターン(Observer)
4.4 チェインオブレスポンシビリティパターン(Chain of responsibility)
4.5 ビジターパターン(Visitor)
4.6 まとめ
第5章 C言語とリファクタリング
5.1 概要
5.2 テスト駆動開発
5.3 TDD入門編
5.4 リファクタリング
5.5 TDD実践編
5.6 まとめ
第6章 継続的インテグレーションとデプロイ
6.1 概要
6.2 継続的インテグレーションの前提
6.3 CIサーバの導入
6.4 CI入門編
6.5 メモリ破壊のバグと戦う
6.6 CI実践編
6.7 まとめ
0004デフォルトの名無しさん垢版2017/04/02(日) 17:02:31.63ID:n7h/bBRg
https://teratail.com/questions/37674

以前、Linuxのカーネルを読んだ時、オブジェクト指向的なプログラムされているなと思ったことが有ります。
データと関数ポインタをセットにしているイメージですね。(仮想関数的なテクニックだったように思います。)
0005デフォルトの名無しさん垢版2017/04/02(日) 17:06:49.50ID:n7h/bBRg
Linuxシステムプログラミング - 60 ページ - Google ブック検索結果
https://books.google.co.jp/books?isbn=4873113628
> Linux のすべてのフアイルシステムの基本となる共通フアイルモデル
> 〈 c 。 mm 。 n 血 em 。 de ー)を導入し、抽象化を図っています。共通ファイルモデルでは、
> 関数ポインタやオブジェクト指向的な考え方†を採用したフレームワークを提供し、フアイル
0006デフォルトの名無しさん垢版2017/04/02(日) 17:52:12.44ID:KLExlLIQ
●ドア設計問題 (出典は初代スレ)
http://echo.2ch.net/test/read.cgi/tech/1488928012/422-423
http://echo.2ch.net/test/read.cgi/tech/1488928012/577-578

1 下記機能をオプションとして持つドアを設計せよ
  (a)ドアストッパー
  (b)ドアクローザー
  (c)ドアの向こう側を目視できるガラス
  (d)内部から外部の一方通行のみ目視できるのぞき穴

2. 1.で行ったクラス設計を破壊せずに下記性質を追加せよ
  (e)異なる耐火性
  (f)異なる開閉重量
  (g)鍵がついており、サムターンか電子錠である
  (h)異なる遮音性
  (i)開き方は右開き左開き、内開き外開きスライドのいずれもありえる
  (j)ドアノブはついていることもついてないこともある

3. 2.で行ったクラス設計を破壊せずに下記性質を追加せよ
  (k)犬猫はドアノブを回転させることはできない
  (l)犬猫はプッシュで動くドアなら、ある一定の重量以下で押すことができる
  (m)数匹の犬猫が同時にドアを押すと合計重量で押すことができる
0009デフォルトの名無しさん垢版2017/04/02(日) 20:48:03.21ID:TvISwdcG
>>6
ドアをどういうソフトウェアの中でどう使うのかを説明しろよ
それなしに”設計せよ”とか意味不明だぞ

そこに書いてるのはドアの属性だけだから単なるデータ
クラスとかオブジェクト指向とか全く関係ない
0010デフォルトの名無しさん垢版2017/04/02(日) 21:12:28.24ID:DzpU0i7z
ドアクラスの設計に上位クラスの意思が必要なら、それはモジュール分解できてないってことじゃね
0011デフォルトの名無しさん垢版2017/04/02(日) 21:21:56.68ID:l1VJjSJU
>>9
こんなんで意味不明とか言ってたらついていけんぞ
このドアに猫を通すにはどうするとか言ってたんだから
0012デフォルトの名無しさん垢版2017/04/02(日) 21:30:37.45ID:TvISwdcG
>>10
〇〇がどう使われるかは全くわかりません
〇〇にはこれこれこういう属性(性質)がありえます
〇〇を設計せよ
ふぁい!?

モジュール分解とか全く関係ない
0013デフォルトの名無しさん垢版2017/04/02(日) 21:38:49.75ID:DzpU0i7z
ドアストッパーは回転角に制限を与える
ドアクローザーは、半開状態時にゆるやかに閉状態へと変化する機構

犬猫が突進すればドアタイプと重量によっては開き、場合によっては開かない
0014デフォルトの名無しさん垢版2017/04/02(日) 22:03:35.89ID:TvISwdcG
建築家がCADで使うためのドアのモデル
ドアメーカーが生産管理のために使うためのドアのモデル
住宅メーカーが受注管理のために使うドアのモデル
ドア開け系のスマホゲームで使うためのドアのモデル

これらが同じになるわけがないんだから
どういう目的でどういう風にソフトウェア上で使われるのか
それがわからないものを設計しようとするのは時間の無駄
0015デフォルトの名無しさん垢版2017/04/03(月) 01:16:59.01ID:LFQkDYJE
>>14
よくよく考えてみるととても難しいが完全不可能ではないしょ、具体的にこんなドアと呼んでないからこそ
どんな状況とパターンでもドアをドアと呼ぶに相応しい共通項を見つけるゲームや
投げる物ではないし食べる物でもないしまぁある程度までは
0019デフォルトの名無しさん垢版2017/04/03(月) 12:21:52.64ID:28dsjWMc
>>17
他の選択肢を比較的簡単に選べるものが上位になってる気がする。
つまりdisりやすいっていう
0020デフォルトの名無しさん垢版2017/04/03(月) 13:17:31.81ID:DYsJriQe
>>1
糞みたいなテンプル貼るのやめろ
0023デフォルトの名無しさん垢版2017/04/03(月) 20:08:09.88ID:VDwG6zpG
>>22
最後にレスした奴が勝者だからな
0025デフォルトの名無しさん垢版2017/04/03(月) 20:20:18.71ID:7vHtJU9B
俺2chの議論で負けたことない

変なこと言い出したり話がそれたりで、俺がレスしなくなるか
俺が相手をやりこめて、相手がレスしなくなるかだ
0027デフォルトの名無しさん垢版2017/04/03(月) 20:54:50.17ID:OUsiIH4G
土俵の下からヤジ飛ばしているだけで勝負している気になってるいつものあいつかw
0029デフォルトの名無しさん垢版2017/04/03(月) 21:47:10.19ID:7vHtJU9B
>>14
そこが決まってないからこそ
物事の捉えかたが人によって違うのがいいんだろ

最初から無駄なのはわかりきってるんだから無駄とかいうな
0030デフォルトの名無しさん垢版2017/04/03(月) 21:49:08.96ID:XYXk6jFX
>>15
どんな状況でもドアをドアと呼ぶに相応しい共通項を見つけるのは
ソフトウェアの設計やプログラミングの話ではなく言語学や哲学における分節化の話
なので板違い
0031デフォルトの名無しさん垢版2017/04/03(月) 21:57:16.66ID:XYXk6jFX
>>29
どういうシステムでどういう使われ方をするドアを想定した結果なのかを示せば
少しはマシだったろうけどそれをやったやつ前スレで1人でもいたか?

コンテキスト無しで現実をモデリングしようとしても設計力は高まるどころか低下するだけ
オブジェクト指向かどうかとか関係ない
無駄
0034デフォルトの名無しさん垢版2017/04/03(月) 22:05:09.73ID:MrxLrKt6
>>30
> どんな状況でもドアをドアと呼ぶに相応しい共通項を見つけるのは

取っ手のないドアがあるから、取っ手は共通項には含まれない
鍵のないドアもある。
材質も関係ない。
0035デフォルトの名無しさん垢版2017/04/03(月) 22:18:18.28ID:MrxLrKt6
なるほど、そうか。

オブジェクト指向を「現実世界を構成しているクラスを見つけ出す作業」と
捉えるからややこしいことになるんだ。

手続き型でも関数型言語でも、現実世界を表現する関数を見つけ出す作業
なんて考えるやつはいない。

見つけ出す作業ではなくて、作り出す作業なんだ。
現実世界ではなくターゲットとする要件を実現する
クラスや関数を自分たちで作り出す作業。

だから最初に要件が決まらないとクラスも関数も作れない

あたり前のことだが、混ぜっ返すやつは
「そのクラス・関数では世界のすべてを表現できない」と言ってるわけだな。
0036デフォルトの名無しさん垢版2017/04/03(月) 22:25:42.68ID:VDwG6zpG
プログラミングが目的になっちゃうと
そういう思考になるのかしらん?
0037デフォルトの名無しさん垢版2017/04/03(月) 22:25:47.59ID:XYXk6jFX
どんな状況でもドアをドアと呼ぶに相応しい共通項を見つけるってのは
ドアという言葉を定義づけるのと同じこと

言葉を定義づけるには「ドアと窓は何が違うのか?」とか
「ふすまや障子はドアなのか?」みたいに隣接する概念と比較する以外有効な方法はない

で「ドアと窓は何が違うか?」みたいな問いを考えるゲームがしたけりゃ
どっか他でやりなよ
ここは板違い
0038デフォルトの名無しさん垢版2017/04/03(月) 22:42:21.43ID:MrxLrKt6
そう。我々がやってるのは、要件でドアと定義されたものを
クラスに落とし込む作業なのだ。

決しての中にあるドアがどういうクラスかを
解析する仕事ではないのだ。
0040デフォルトの名無しさん垢版2017/04/03(月) 23:09:18.39ID:7vHtJU9B
>>31
同じドアを扱っているにもかかわらず
最初は小売りか設計かと思わせておいて
いきなり「猫に押される」っていうコンテキストも抽象度も異なるものが割り込んでくるのが
問題の肝

多少視点をゆさぶられても大丈夫なのを設計しろってことだろ
そこで状況がわかんないとか言ってたら降参してるようなもんじゃん
0044デフォルトの名無しさん垢版2017/04/04(火) 00:33:57.09ID:Tk79CS9z
現実世界をモデリングできているか、とかいう謎の評価基準

迷宮を進むゲームでドアとして表現されたドアがあったとして、そのモデリングの良し悪しを
・家の内装をVR体験させるソフトでも使えるか
・大型家電通販でドア付きの部屋に搬入できるかをチェックするプログラムでも使えるか
・エアコンの空調のシミュレーションでも使えるか
で判断したことがあるのかな。そうだったら何も言えない。
0045デフォルトの名無しさん垢版2017/04/04(火) 01:01:13.36ID:AiGPoot5
オブジェクト指向にむりやり難癖つけてるけど結局
「具体性を持たせることで取り回しが楽になった」に対して
「これには対応できるのか!」「こういう例外はどうだ!」って難癖てるだけだから
「で、おまえの棲んでるとこの方は取り回しどうなの?」って
隠れ家に光浴びせると黙って棲んでる泥に潜っていくというね…
0046デフォルトの名無しさん垢版2017/04/04(火) 01:32:16.54ID:QcgfrUUh
>>40
問題の肝でもなんでもないわw

そういうふうに設計が変わった時に
安全な方法で設計を変更するのが
リファクタリングだよ。

どっかのバカ共は、汚いコードを修正するものだと
勘違いしているようだがね。

オブジェクト指向に限らず、変更はあるのだから
その変化についていく技術が重要
0049デフォルトの名無しさん垢版2017/04/04(火) 07:33:17.45ID:gTa0RwdG
素材まで網羅した完璧なドアの設計を最初からしなくて良いのがオブジェクト指向の強みなんじゃね

難癖野郎の要望にも応えられる
0050デフォルトの名無しさん垢版2017/04/04(火) 07:34:20.63ID:gTa0RwdG
>>17
C#最高なだけじゃねえか
0051デフォルトの名無しさん垢版2017/04/04(火) 15:08:10.80ID:AeH3x9f/
今後も使い続けたいと思うかどうかの割合が低いもの

嫌われている

さすがマイナビ
堂々とすり替えw
0052デフォルトの名無しさん垢版2017/04/04(火) 18:42:21.83ID:PnaBNYoq
データベース操作クラスって
アンチパターンらしいですけど
世間ではどうやって操作をまとめてるんですか?
0054デフォルトの名無しさん垢版2017/04/04(火) 19:01:23.29ID:12S8JRG0
オブジェクト指向って、
プログラミングを自動化=部品化してくれるものというイメージしかない。
プログラマはプラモデルを組み立てているような感覚。
0057デフォルトの名無しさん垢版2017/04/04(火) 19:54:26.70ID:bhbbdSm0
>>54
これがオブジェクト指向の一つの存在パターンやしな
スマホアプリとかの画面パーツはこれで配布してるし
005852垢版2017/04/04(火) 20:11:51.69ID:PnaBNYoq
操作がクラス名としておかしいと、
何かの読み物で読みました

名詞じゃないクラスは
オブジェクト指向が出来ていないと
疑えと

じゃあデータベースなら良いのかなと
思いましたが、屁理屈かなとも思い
0059デフォルトの名無しさん垢版2017/04/04(火) 20:18:23.65ID:y0lCbigz
それってUpdateHogeクラスみたいなのがあるってことなの?
Commandパターンとかなら理解できるが
データベース操作用にそういうクラスは普通作らないわな
0060デフォルトの名無しさん垢版2017/04/04(火) 20:57:28.90ID:pJiiTfw5
>>56
その抽象化がDAOやろ?
0061デフォルトの名無しさん垢版2017/04/04(火) 21:01:19.65ID:eKQOUvI0
DAOクラスの設計までごちゃごちゃ言い出すのがオブジェクト指向

お前らの話聞いてたらデータベースにつなぐのに何年かかんだよ
0062デフォルトの名無しさん垢版2017/04/04(火) 21:08:11.49ID:QcgfrUUh
>>61
説明だけなら数分もあれば終わるだろうから
それ聞いて接続できるまでの時間はお前次第だと思う。
0064デフォルトの名無しさん垢版2017/04/04(火) 21:09:58.53ID:pJiiTfw5
でもDAOが糞面倒なのは同意だが
0066デフォルトの名無しさん垢版2017/04/04(火) 21:38:41.73ID:bhbbdSm0
db操作クラスっていかんのか
名前の通りdbから変数やデータ取り出して入れる専用クラスって意味でいいんだよな?

オブジェクトで使い易いんじゃないのか??
0068デフォルトの名無しさん垢版2017/04/04(火) 23:04:38.14ID:eKQOUvI0
>>62
絶対に数分じゃ説明できない

途中で猫の生態みたいな解説をいれるのがオブジェクト指向だから

SQL叩きますの他の言語とは一味違う
0070デフォルトの名無しさん垢版2017/04/05(水) 00:38:08.73ID:yRUZ/Ldq
オブジェクト指向ってこういうやつやろ!?が酷すぎて
田舎の中学生が「ぼくのかんがえたアメリカ人」の作り話を大人にしてるみたいになっとるな。
0073デフォルトの名無しさん垢版2017/04/05(水) 08:19:13.48ID:RcS41rYJ
>>71
どう間違ってるの?
0076デフォルトの名無しさん垢版2017/04/05(水) 15:50:39.12ID:UwNB2dkT
>>74
存在が間違ってる奴本人が自己紹介

>>73
DAO 想像力が足りない 辺りでググれば出たくるんじゃなかったかな

あの記事はPHPerのものにしてはとても良く書けているから必読だ。
近くにActiveRecordとDataMapperの実装解説もあるから、まだDAOとか言うゴミを使ってるバカは是非読んだ方がいい。
最終的な実装はあれでもダメダメだけどな。
0077デフォルトの名無しさん垢版2017/04/05(水) 21:47:59.72ID:ABzSOhTe
オブジェクト指向は命名が重要だけど、DTOにはなんて名前付けてますか?

自分はHogeDTOとか付けてるけど
我流なんで自信が無いです
0078デフォルトの名無しさん垢版2017/04/05(水) 22:31:27.34ID:T1xSqOuQ
個人的にはHogeDaoとかHogeDtoみたいなのがたくさんあるとやる気なくす
HogeQueryとかHogeCommandとかHogeJsonみたいなもう少し意味のある名前がいい
0080デフォルトの名無しさん垢版2017/04/05(水) 23:31:52.52ID:ABzSOhTe
ほぼストアドでシステム開発してる人が
最近の連中は技術が無くてストアド書けないと嘆いていたのですが
ストアドでオブジェクト指向は出来るんですか?

C#+EFでほとんどSQLを書いたことが無いので
データベース事情に明るくないもので
0083デフォルトの名無しさん垢版2017/04/06(木) 04:16:30.36ID:2G8EDGPv
>>80
一応Ora限定で出来たと思うけど、Web方面だと
エッジサーバ側であれこれするからストアドいらん気もするよ
業務系だとストアド一本で職になるようだが
0084デフォルトの名無しさん垢版2017/04/06(木) 04:54:01.44ID:2G8EDGPv
1クラスについて、最低1in/1out(interface)を作るよう指示されたことあったな
全てのクラスについて

ヘキサゴナルなんだと、それが……
0085デフォルトの名無しさん垢版2017/04/06(木) 05:56:27.93ID:8G48c3ze
なんでもストアドでやるのはバッドノウハウだが使うべき所では使わないとくっそ遅いシステムが出来上がるぞ

某大手ITが作ったくっそ高いシステムみたいに

オブジェクト指向も拗らせ過ぎるとこうなるって典型例
0086デフォルトの名無しさん垢版2017/04/06(木) 09:05:31.52ID:sp2ENUYJ
>>76
最終的な正解が書いてあるサイトはどこですか
0089デフォルトの名無しさん垢版2017/04/06(木) 12:29:44.71ID:GOr1AWzR
>>82
オブジェクト指向と言わず
共通の開発手法があるのかなと

モデリングがそれに当たるのかな
0090デフォルトの名無しさん垢版2017/04/06(木) 12:47:05.55ID:fGciOGwI
>>86
I'll tell you nothing.
The answer is where it's present will not be indicate even by Google.
That must find out by an effort and a deliberation of yourself own.
0092デフォルトの名無しさん垢版2017/04/06(木) 13:35:28.83ID:fKQHZKUE
>>90
Oh, dont say that!Dont say that.Im a stupid man.You should be kind to me!
0094デフォルトの名無しさん垢版2017/04/06(木) 18:06:11.40ID:7ga4e71i
オブ農って何ですか?
0096デフォルトの名無しさん垢版2017/04/06(木) 18:36:07.83ID:FGV9lFi+
>>89
ストアドは基本SQLだからDB設計出来る程度のリレーショナルモデルの知識あれば十分
技術うんぬん言うほと難しい話じゃない DBが違えば中身はいろいろと違ってくるけどね

ストアドで条件分岐やループやカーソルを多用してる場合
本当にDBレイヤーでやるべき仕事なのか考えたほうがいいと思う
ビジネスロジックのあるべき場所や柔軟性と最適化のバランス次第
0099デフォルトの名無しさん垢版2017/04/07(金) 07:14:09.24ID:mWTY/96m
データベースのモデリングした後
オブジェクト指向のために
クラス設計すると、エンティティの
抽出とか同じ事をしている気に
なってくるんですが

モデリングは実はクラス設計だけで
OKとかありますか?
0100デフォルトの名無しさん垢版2017/04/07(金) 09:46:16.48ID:xCtKbZyH
>>99
そのためにO/Rマッパーがある。
O/Rマッパーを使うとデータベースのモデリングを
クラスで表現できるから、そのまま移植すれば良い
0101デフォルトの名無しさん垢版2017/04/07(金) 10:24:46.37ID:IERj5jiz
ORマッピングすればDaoなんていらんね
0102デフォルトの名無しさん垢版2017/04/07(金) 11:00:36.56ID:Bku+sAks
>>97
意識して減らそうとしないと無理かな
ストアドは、テーブルや索引、マテリアらいずビューとかの整理に使う物かな
要は、あるタイミングでデータベースを単一の主体が加工する場合に使うと便利
複数クライアントが平行して操作するときに共通化を求めてやるもんじゃない。
それは、ビューなりストアドトリガーや制約で共通化するべきもの。
条件分岐があるなら、BLに溶け込ませろってのはそういう意味かと
0103デフォルトの名無しさん垢版2017/04/07(金) 11:05:00.66ID:Bku+sAks
ストアドプロシージャは、共有メモリや通信を目的に設計されていない。
なんかの結果を通信用に設けたテーブルに書いて、そのテーブルを別の主体が参照して連動させるとかオーバヘッドが多く、排他が冗長になり、パフォーマンスがでない。
0105デフォルトの名無しさん垢版2017/04/07(金) 14:06:58.01ID:IIlb/TvM
>>102,103
基本的に何言ってるかよくわからない。

例えば集約関数実装することを考えれば、元となるデータの通信を行わなくて良い分、
ストアドの方が速い可能性が高い。

また、複雑なデータ処理や文字列操作が多くてストアド自身のコードの実行が遅い場合もあるが、
ストアドに別言語を使えるRDBMSもある。

さらに言えば、ストアドがimmutableであるなどの宣言ができるRDBMSがあり、その場合は
実行結果をキャッシュしてくれたりする(同じ引数の場合はコードを実行しない)。

ビジネスロジックをRDBMS内部におくべきかどうかというのは、また別の話。
0106デフォルトの名無しさん垢版2017/04/07(金) 18:38:30.82ID:Er4jaX4h
最初はデータ中心アプローチでいいよ

カージナリティーとかに抜けが発生するからね
それからモデル層の設計すればいい
0108デフォルトの名無しさん垢版2017/04/08(土) 12:10:05.09ID:gBZ8NF+o
>>105
集約関数、つまりある複雑な条件、複数のテーブルを結合せずに参照し、なんらかの判定を行う。
これは一般的なバッチ処理と言われるもので、データベースインスタンスに閉じて実行すればよい。
何らかのパラメータが伴い、レコードのサブセットのみを対象にする場合、ストアドにしても処理遂行を基準に、倉実行してもパフォーマンスは劇的には変わらない。

データベースは、純粋に取り扱うレコード数に比してパフォーマンスが確定する。

あと、結合できるなら、ストアドはいらない。
ビューなりマテリアルズどビューのがまし
0112デフォルトの名無しさん垢版2017/04/08(土) 13:51:19.98ID:MmqHTY99
まともにキャットドアもデータベース接続もできないゴミが、僕が使ってる言語のライブラリをだしにしてホルホルするスレだよ
0115デフォルトの名無しさん垢版2017/04/08(土) 18:27:20.39ID:ZmPKT6lF
>>108
集約関数もバッチ処理も理解できないやつは
いちからやり直すかプログラミングから足を洗うかしてくれ
0117デフォルトの名無しさん垢版2017/04/09(日) 01:56:39.35ID:+d/g4xuk
要件の一つに「Oraにロックインされるの勘弁」があるとマッパー必須

……いやなのは「もうOracleにカネ献上するのは嫌なんや!」って奴
既存のストアド見て置き換えなきゃいかんでしょ

最高にクソだったのは1関数5000行if12段のストアド
あれはサジ投げてとりあえずおっつけの改修だけやることにした
0119デフォルトの名無しさん垢版2017/04/09(日) 02:34:17.14ID:+d/g4xuk
>>118
設計書がどうこうとかじゃなくて、「おにぎりスタッバー」程度余裕で超えるド畜生
丸尾末広とか風船クラブ級の理解不能レベル

だから俺のところに来たんだろうが、さすがに当座のおっつけ以上の対応はムリだったな
0120デフォルトの名無しさん垢版2017/04/09(日) 02:39:11.61ID:+d/g4xuk
むしろ1関数5000行if12段の脅威を感覚でわからんとかヤバいな

最低でも2048くらい分岐が発生する
平均的な人間は7くらいしかわからん(Code Completeを参照のこと)
0121デフォルトの名無しさん垢版2017/04/09(日) 02:50:02.23ID:+d/g4xuk
一応言っておくが、俺はWAISテストで引っかかってるんで3か4しかわかんねぇようだ
まぁそのくらいあればシノギはできるようだがね

WAISでググるこたぁなかろうし、ググったらヘイトするんだろうけどな
0125デフォルトの名無しさん垢版2017/04/09(日) 09:36:40.13ID:Ch2od0MN
無理なクラスタリングはハンマー釘病になる
その場その場に応じた最適解を選べばいいだけ
0127デフォルトの名無しさん垢版2017/04/09(日) 23:56:30.49ID:dNHxTouX
12段ifに於ける1つの分岐
if(a){ if(b){ if(c){ if(d){ if(e){ if(f){ if(g){ if(h){ if(i){ if(j){ if(k){ if(l){
....x;
} else {
....y;
}}}}}}}}}}}}
0128デフォルトの名無しさん垢版2017/04/10(月) 00:17:53.55ID:f5bfXI8/
改良版

if(a && b && c && d && e && f && g && h && i && j && k && l) {
....x;
} else {
....y;
}

ここから言いたいことがわかるかね?
0134デフォルトの名無しさん垢版2017/04/10(月) 13:12:58.61ID:Bu07ZLW6
>>120
ちょっとはまともな文章書けないのかね。

12段ifというのが12個のifということなら、分岐回数は最大で12回。
ネストしない12個のifなら、分岐の組み合わせは2^12=4096個。
>>127のように完全にネストした12個のifなら、分岐の組み合わせは13個。

Code Completeに何が書かれてるのかしらんが、正しく読み取れてないのでは?
0135デフォルトの名無しさん垢版2017/04/11(火) 04:41:06.97ID:mchlWSiU
>>134
あーうん、そんなもんだねぇ2048じゃなかったな

キャンパスノートを2冊くらい使ってメモしつつ
デバッグしてもどこでバグってるのかわからんのよ、あれは参った
とりあえず動くようにはしたがエラー系がすげぇ怖いね
後日何も連絡来ないから気にしなくていいんだろうけど

>>134
変数や関数などは、平均的な人間は7個までしか覚えられないから気をつけろよ、
という心理学の知見が公表されているページがあるんよ
0136デフォルトの名無しさん垢版2017/04/11(火) 07:15:24.21ID:8/HzfseJ
物理クラス設計にDTOって書きますか?

一応クラスだしなぁと
悩んでます

流石に論理じゃ不要と思いますが
0137デフォルトの名無しさん垢版2017/04/13(木) 07:07:56.79ID:FYxnOP1R
社員クラスと所属クラスがあって
年月を問い合わせたら
その年月時点での所属を返すように
したいのですが、どちらのクラスに問い合わせるのが正しいと思いますか
0138デフォルトの名無しさん垢版2017/04/13(木) 07:18:59.41ID:m/ZfxtWH
おいらなら、社員クラスに所属クラスを埋め込むが。
と言うか、所属はクラスである必要すら感じない。
構造体でよく無いか?
0142デフォルトの名無しさん垢版2017/04/13(木) 20:19:04.83ID:U0NTTHzz
所属クラスは確かにおかしいですね
部の下にグループがあるので部署という名前は避けたのですが
部署クラスがグループ教えてくれるのはなんら問題ないことに気付いたので部署クラスに改名しました

社員クラスのフィールドには
·社員番号
·氏名

部署クラスのフィールドには
·部署
·部署配下のグループ

としているのですが
所属部署を知りたい時に、社員に今の所属を聞くべきか、部署に社員の所属を教えて貰うのか、どちらが好ましいのかなとお聞きしたくて書きました
0143デフォルトの名無しさん垢版2017/04/13(木) 21:34:32.88ID:kfgJyhKZ
>>142
社員がわかっているときは、社員に聞けばいいし、
部署がわかっている場合は、部署に聞けばいい。
どちららでもOKだし、ちゃんと作るならば
どちらからでもできるようにする

これは分かってない人意外と多いんじゃないかと思うけど、
データベース(RDBMSを使わないにしろ)っていうのは、
単体のテーブルの集まりではなくて、全体で一つのデータベースなんだよ

クラスに置き換えていうならば、クラス一つ一つが単独で存在しているのではなくて
クラスとクラス、そしてその関係を定義して、複数のクラスで一つのデータベースを表現する
(ただし設定テーブルのような、他の完全に独立しているテーブルのような例外はある)

だから社員クラスのフィールドには、所属部署というフィールドを持っているだろうし
部署クラスには、所属社員を取得するメソッドが存在している
0145デフォルトの名無しさん垢版2017/04/14(金) 01:10:42.96ID:DK6sdjwT
>>137
どっちでもええ、ダメだったら直すまでだ

JavaのAPIというか一回書いたら半永久的に治せないインターフェースを書いてるわけでもないだろ
あるいは大企業の連中が使ってるイミフなフレームワークか

そんなん言っても満足されないならこのくらい

・社員が子会社に転籍とかフツーにあり得るなら「社員」に持たす、全グループ間で同一のアプリ使ってる前提だが
部署だと会社跨いだら引けなくなる設計になってる可能性もあるんでな
・一社だけなら部署でも社員でもノリで決めていい(多分直せるはずだ)
0146145垢版2017/04/14(金) 01:15:51.93ID:DK6sdjwT
とりあえず目的が「特定の社員の所属状況を引く(あるいは特定社員の在籍履歴を引きたくなって機能追加)」なら
社員に持たすだろうかな
個人のトラッキングが目的なら個人を扱うクラスが責任取るべき

部署に持たすってなら「今日の部署の人員配置状況がわかること」が目的ってことになるんで
0148デフォルトの名無しさん垢版2017/04/14(金) 01:36:29.65ID:DK6sdjwT
>>147
interfaceがうるさい連中の筆頭はJavaっ子なんでなあ
パっと思いついたのがアレだった

ンなんだったらJSRにvar変数提案しろよとも思うのだが(あるいはScalaっぽくするか)
0149148垢版2017/04/14(金) 01:36:57.02ID:DK6sdjwT
varがあればダックタイピングもできるだろうしな
0150デフォルトの名無しさん垢版2017/04/14(金) 03:32:44.79ID:DK6sdjwT
もう寝るか

Java8のlambdaなんとかならんもんかねぇ
スレッドのラッパーってのは期待してなかった(高階関数と、関数テーブル用途が使えん)
ドロイド君のイベントに差し込むのには使えようが
0151デフォルトの名無しさん垢版2017/04/14(金) 07:12:34.16ID:n5pL5Dn8
意外とどちらでも良いんですね

モデリング的に部署に聞くのはあり得ないとか言われると思ったのですが

ただ、社員にも部署にも問い合わせ可能なのが好ましいというのは驚きでした 冗長と言われそうで考えになかったもので 参考になります
0153デフォルトの名無しさん垢版2017/04/14(金) 09:07:05.40ID:aK3T4zVf
>>150
はい?
0156デフォルトの名無しさん垢版2017/04/14(金) 23:57:33.02ID:2Ku103cF
Cobolですら現役なのに

JavaをオワコンにしようとしてるやつはJavaの何が気に入らんのだ
0160デフォルトの名無しさん垢版2017/04/15(土) 00:14:08.96ID:b29XQl7t
されねーしいらねーし
0165デフォルトの名無しさん垢版2017/04/15(土) 09:43:01.13ID:01wvAL9A
>>134
でも分岐数4Kって訳でもないんだろ?
それ2048の関数があるのと変わらない
0166デフォルトの名無しさん垢版2017/04/16(日) 02:05:28.12ID:IBph2Vsu
>>156
Javaはもともと組み込み言語だったんで、真剣にやると
他言語ではできることがJavaではできないってことがよくある

手数かけりゃそりゃいくらでもできるが、要求が出たら今日リリースできて当然の
職場だと厳しいよ
0167166垢版2017/04/16(日) 02:23:40.59ID:IBph2Vsu
Struts1 + Hibernate固定とか、Spring + Hibernate固定の現場で、
お客さんからハナシ聞いて1〜2週間後に納品、みたいなのが許されるならJavaでも構わないと思う
まあアレだ「エラーが絶対に出ないこと」ならJavaのほうが有利なのは認めるんで

エラーが多少出てもいいから最速で「だいたい」動くものが必要だって働き方だとJavaキツい
0168デフォルトの名無しさん垢版2017/04/16(日) 02:41:47.00ID:cCOM2/u0
>.166
組み込み言語だったことが理由で
他の言語で出来てJavaで出来ないことって何?
0170デフォルトの名無しさん垢版2017/04/16(日) 05:04:51.94ID:IBph2Vsu
>>168
lispあるいはrubyのlambaか、groovyかscalaのクロージャ
pythonのは不完全だ
mixinとかについてはもうどうでもいいや

>>169
時間的な意味で言うと、半年〜1年くらいでバグレポが電話で届くくらい
社内におったてたReadmineに「今日なんか動きません >_<」って事務員のおぜうさまからご連絡があるとか、その辺
0171デフォルトの名無しさん垢版2017/04/16(日) 09:40:21.87ID:0mT+BZRD
オブジェクト指向と言ったらjavaがメジャーだしjavaが出来れば良いと思う

C++メインでオブジェクト指向できるという人は構造化プログラマが多い気がするから業務システムでの採用は避けたい

C#は隠れVB野郎が擬態してる可能性が高いから根本的に避けたい

Rubyは俺が知らないw
0172デフォルトの名無しさん垢版2017/04/16(日) 09:44:29.62ID:0mT+BZRD
VB.NETでオブジェクト指向してる人間って2割居ないんじゃ無いかと思う
構造化プログラムしてるのが5割で、残りは非構造化プログラムってイメージ
0176デフォルトの名無しさん垢版2017/04/16(日) 13:37:47.43ID:P5/zt8YK
純粋でメリットがあるのって、開発環境的なツールだけだよな。
人間にとっては、そのツールの恩恵を受けられる事に多大なメリットがあるけど、言語自体に直接的なメリットを感じないわ。
0178デフォルトの名無しさん垢版2017/04/17(月) 09:29:54.87ID:ZPW6EaCZ
てかC#の売りは、あのXMLでフォームを作れる点じゃないのかね。
泥のアプリに感覚が近い。
フレームワークなんだろうが、あれなしでC#を使うとは思えず、凝ったことはAPIやCOMを自分で使わないといけないような。
だから、業務系システムでC#はわかる。
0180デフォルトの名無しさん垢版2017/04/17(月) 09:53:49.97ID:avieXFWj
>>178
はい?
0181デフォルトの名無しさん垢版2017/04/17(月) 21:36:17.70ID:kf1yWIvT
コーヒーを飲むって動作は誰にさせると上手くいきますか?

コーヒーを飲む人?
コーヒーが飲ませる機能を持っている?
コーヒーを飲む人でないメイドさんか誰かが飲ませてくれる?
0182デフォルトの名無しさん垢版2017/04/17(月) 21:47:08.34ID:viGpNXOw
2つの物体の相互作用をどちらかを主語にしないと記述できない時点で
今主流のオブジェクト志向はクソ
0183デフォルトの名無しさん垢版2017/04/17(月) 21:49:52.39ID:avieXFWj
石原さとみのおっぱいに垂らした温いコーヒーをナメるのがベスト
0184デフォルトの名無しさん垢版2017/04/17(月) 21:56:46.03ID:LB/3uUQe
>>181
> コーヒーを飲むって動作は誰にさせると上手くいきますか?
メソッド=動詞を実行できる人

>>182
2つの物体の相互作用は、それぞれの物体の作用に分解できる
0185デフォルトの名無しさん垢版2017/04/17(月) 22:04:31.38ID:D9tI2U/v
>>183
それを設計するとナメるという行為と石原さとみのおっぱいのたゆみ、それによるコーヒーの流れ、流れに応じた舌の移動、さらに石原さとみの悶えという不確定要素など複数のオブジェクト間のフィードバックループを形成しないといけない
現実をプログラムにするというのは非常に難しいものだ
0186デフォルトの名無しさん垢版2017/04/17(月) 22:16:18.42ID:VvYNlkfx
オブジェクトはメソッド実行するときはたいてい目的語
でもたまに、処理を移譲するよなときは主語になる

一定してないから混乱の原因
自信ついたあたりで現実のモデリングをしようとすると面食らう
0187デフォルトの名無しさん垢版2017/04/17(月) 22:26:26.94ID:n/MHuOf5
だいぶ前にこの類いのスレ立ててる奴が
「コーヒー」クラスが「ドリンク」メソッドで「プログラマー」に代入されてるジョークTシャツ持ってきて
「だからオブジェクト指向は〜」ってやってたのの本人による再放送でしょ。
キャットドア誰も相手してくれなくなったから。
0190デフォルトの名無しさん垢版2017/04/18(火) 07:13:33.23ID:YLExNRL3
去年.NET3.5の新規開発で
VB9.0を選択しちゃうウチの職場は
未だにオブジェクト指向を導入していません

そろそろオブジェクト指向開発を調査した方がいいでしょうか
0191デフォルトの名無しさん垢版2017/04/18(火) 09:09:55.12ID:+QApwmMZ
その程度の仕事しかしてないということなので不要です
0194デフォルトの名無しさん垢版2017/04/18(火) 13:42:04.65ID:dT36T5gx
キャットドア厨はオブジェクト指向以外で問題解決してみてから言えよ
これやらないからカスなんだよ
0198デフォルトの名無しさん垢版2017/04/18(火) 20:35:48.45ID:MNbxM32c
>>197
悪魔の証明と化してる
0200デフォルトの名無しさん垢版2017/04/18(火) 21:40:24.96ID:2/KqF/My
オブジェクト指向のおかげです
0201デフォルトの名無しさん垢版2017/04/18(火) 21:41:20.30ID:2/KqF/My
オブジェクト指向完全に理解した、超簡単だった
0205デフォルトの名無しさん垢版2017/04/19(水) 11:36:32.83ID:ZFpUIjRr
>>199
n種類の操作主体がいて、m種類の操作対象があるとき、DoorOpener的なクラスをm個作り、それぞれにnこのメソッドを作るのか?
操作主体が一つ増えると、既存のm個のクラスにそれぞれ一つのメソッドを追加する必要がある
また、操作対象が一つ増えると、あらたにn個のメソッドを作成する必要がある
0206デフォルトの名無しさん垢版2017/04/19(水) 12:10:38.64ID:rIlDsUIc
>>205
ドアを障子に変えてくれって要求があるかもしれないし、もしものことを考えて複雑に作るより今の要求を満たす必要最小限にしておけば作り直しやすいのじゃないかな
0208デフォルトの名無しさん垢版2017/04/19(水) 12:20:37.70ID:rIlDsUIc
継承もカプセル化もオブジェクト指向には必要ない
クラスを作る、つまり型を定義する事こそがオブジェクト指向
0210デフォルトの名無しさん垢版2017/04/19(水) 12:32:00.02ID:rIlDsUIc
文字コードを相互に変換するときいったんウニコードに変換するように、対象や主体をそれぞれ抽象化オブジェクトに変換すればよいのかもね

対象と主体の操作は抽象化オブジェクトに対して行うようにしておけば、対象や主体が増えたとしても抽象化オブジェクトへの変換だけ実装すればよい
0211デフォルトの名無しさん垢版2017/04/19(水) 12:55:20.19ID:rIlDsUIc
抽象化オブジェクトに変換を行うトランスフォーマクラスと抽象化オブジェクトに対する操作を行うプロセッサクラスがある

具象オブジェクトが追加されたときはトランスフォーマとプロセッサを変える必要がある

見通しはいいかもわからんね、抽象化オブジェクトの関係は一箇所に集約されるから
0215デフォルトの名無しさん垢版2017/04/19(水) 13:49:21.08ID:ZFpUIjRr
>>206
> ドアを障子に変えてくれって要求があるかもしれないし、もしものことを考えて複雑に作るより今の要求を満たす必要最小限にしておけば作り直しやすいのじゃないかな
まあ、あのコードが最小限だとして、その範囲ですらOCPに違反してるんじゃないですかねって指摘なんだが。
0216デフォルトの名無しさん垢版2017/04/19(水) 19:01:16.59ID:rIlDsUIc
>>215
ocpは耄碌したメイヤおじさんの考えだろ
オブジェクト指向がブラッシュアップされる前の
無駄の塊だった頃の話だ

最新のオブジェクト指向では継承もカプセル化も
害悪でしかないことがわかってる
0217デフォルトの名無しさん垢版2017/04/19(水) 19:03:57.03ID:rIlDsUIc
>>214
オブジェクト指向が浸透するまでは有益だったかもしれないが、今や誰もがオブジェクト指向を熟知し使いこなす時代、カプセル化はロジックを不鮮明にするノイズでしかない
0218デフォルトの名無しさん垢版2017/04/19(水) 19:06:43.59ID:rIlDsUIc
メイヤおじさんは実装の継承を推奨する老害だからな
バージョン管理ソフト使えよと
0220デフォルトの名無しさん垢版2017/04/19(水) 19:29:36.25ID:/l6NHl5b
>>217
不鮮明となるのであればそれは用件が曖昧であるためカプセル化できてないと俺は考える
エンジンの仕組みを知らなくてもアクセルを踏めば車は動くようにわざわざ考える必要もない事は隠蔽しちゃおうぜ!ってのがカプセル化だと思ってる

まぁ解釈はそれぞれだから合わせてもらわなくていいけどね
0221デフォルトの名無しさん垢版2017/04/19(水) 19:35:54.11ID:XuQTPPrh
フスマと回転扉で同じキャットドアで済むわけないじゃん
これを違うものとして組めないコードは問題

結局、キャットドアなんだよ
0224デフォルトの名無しさん垢版2017/04/19(水) 19:45:45.55ID:d/SqmCf2
>カプセル化はロジックを不鮮明にするノイズでしかない
寝言にもほどがある

中が丸見えで依存しまくってたら
何かするたびに処理の全体追わなきゃいけなくなるだろうが
0231デフォルトの名無しさん垢版2017/04/19(水) 20:07:46.83ID:d/SqmCf2
あまりにもオブジェクト指向が当たり前になりすぎて、それがもたらしてくれるものを忘れてるだけだ

Cに++なんてついてなかった時代
配列を関数に渡すとき一緒に配列の長さを引数で渡してた
地獄のような時代があったんだぞ…
0232デフォルトの名無しさん垢版2017/04/19(水) 20:11:22.44ID:/l6NHl5b
>>229
言い過ぎじゃない
カプセル化の意図は隠蔽と独立

ガス欠で動かなくなった車に対してタイヤ交換はしなくていい
問題を切り分けて問題解決の速度を向上させるためにカプセル化はとても有効
0234デフォルトの名無しさん垢版2017/04/19(水) 20:26:00.72ID:3xQf6WAc
『"このパーツの動作は保障されている"がないとプログラムは工業製品にならない』
ってのが始まりだしね。

ある意味「企業向けオーダーメードプログラムを手作業で人月かけてやるのが
職業プログラマって仕事なんだよっ!!」って請負業者がプログラマ名乗って
コンシュマーに売る工業製品としてのアプリケーションプログラム販売が傍流みたいになってる日本じゃ
「動きゃいい」が蔓延するのもしかたがないこと
0236デフォルトの名無しさん垢版2017/04/19(水) 20:34:11.59ID:lCKuRFX1
端末変えたからID変わってるから
0237デフォルトの名無しさん垢版2017/04/19(水) 20:35:16.70ID:lCKuRFX1
>>232
それただのたとえ話じゃん
バグが寸分の狂いもなく立ちどころにわかるってのは言い過ぎだよ
0238デフォルトの名無しさん垢版2017/04/19(水) 20:36:51.30ID:lCKuRFX1
>>231
構造体に配列の長さと配列をセットで持たせればいいのに
0240デフォルトの名無しさん垢版2017/04/19(水) 20:41:15.47ID:lCKuRFX1
>>239
カプセル化に夢見すぎだよ
バグってる場所が3秒でわかるとか大嘘もいいところだよ
絶対嘘だね、どんなバグかもわかんないしさ
0241デフォルトの名無しさん垢版2017/04/19(水) 20:41:33.40ID:oz+MR2rn
まぁまぁ ロジックの中が見えてバグがどこで発生しているかもすぐに分かる純粋関数が最強ってことで
0242デフォルトの名無しさん垢版2017/04/19(水) 20:42:40.87ID:lCKuRFX1
カプセル・スリー・セカンド
0243デフォルトの名無しさん垢版2017/04/19(水) 20:44:01.82ID:/l6NHl5b
>>240
誰が三秒って言ったのよ
速度向上と言ったまでさ

繰り返しになるけど所詮価値観の違いなので合わせてもらわなくていい
0244デフォルトの名無しさん垢版2017/04/19(水) 20:46:48.18ID:lCKuRFX1
>>243
速度向上ならわかるけど
0245デフォルトの名無しさん垢版2017/04/19(水) 20:49:45.97ID:lCKuRFX1
>>241
純粋関数ってメソッドの中でも再代入を許さないんだっけ?
それって遅くない? モナド使わないと現実的に厳しくない?
すべてがモナドになればよくない? そうしてできたのがC言語です
0246デフォルトの名無しさん垢版2017/04/19(水) 20:58:24.07ID:oz+MR2rn
>>245
そして構造化プログラミング、モジュールプログラミング、オブジェクト指向のカプセル化と来て
関数型に戻るわけですな
0247デフォルトの名無しさん垢版2017/04/19(水) 21:02:34.85ID:lCKuRFX1
>>246
極端なところに正解はないと思うんだよ
バランスが取れているのが現実的に最も優れている
カプセル化してないオブジェクト指向が最高ってことになるのかな?とどのつまり
0249デフォルトの名無しさん垢版2017/04/19(水) 21:10:34.01ID:oz+MR2rn
カプセル化してないオブジェクト指向のメンバーなんて
読みにくいグローバル変数みたいなもんじゃない?
0250デフォルトの名無しさん垢版2017/04/19(水) 21:18:19.43ID:lCKuRFX1
>>248
聞く、どうぞお話どうぞ
0251デフォルトの名無しさん垢版2017/04/19(水) 21:20:38.66ID:lCKuRFX1
>>249
グローバル変数とは全然違う
フィールドはオブジェクトに属しています
オブジェクトがなければありません
オブジェクトを作って初めて使うことができます
オブジェクトのライフサイクルと運命をともにするからこそ
オブジェクト指向なんです
finalをつけるのがデフォ
0252デフォルトの名無しさん垢版2017/04/19(水) 21:41:01.53ID:/l6NHl5b
>>247
極端だろうが何だろうが正解なんかないさ
おまえはおまえの思いでやればいい

すべてを同じ枠に押し込めようとして八方塞がりにならないよう気をつけなよ
0253デフォルトの名無しさん垢版2017/04/19(水) 21:56:25.91ID:lCKuRFX1
>>252
俺が俺の思いでやるのは当たり前のことだと思うんだよ
雨が降ったら傘をさせばいいと言ってるようなもの
当たり前じゃん?いう意味なくない?
プールで泳ぐときは服を脱げばいいみたいな
出かけるときは靴を履けばいいみたいな
価値観の違いにこだわってるのはそっちのほうなんじゃないかなって思いました
0254デフォルトの名無しさん垢版2017/04/19(水) 21:59:29.16ID:lCKuRFX1
カプセル化しないオブジェクト指向がモダンで優れた設計っていうのは
>>252と俺の共通認識としてあるわけだから、その上で思いを語っていただけたら
0256デフォルトの名無しさん垢版2017/04/19(水) 22:06:05.25ID:lCKuRFX1
>>255
フィールドが全部finalだったらprivateなんて必要ないだろ?
つまり、カプセル化って必要なくない?
0257デフォルトの名無しさん垢版2017/04/19(水) 22:07:41.10ID:lCKuRFX1
隠すメリットより公開するメリットの方が莫大だと思わない?
0258デフォルトの名無しさん垢版2017/04/19(水) 22:18:28.62ID:lCKuRFX1
公開するメリット隠すデメリットを考えよう
0259デフォルトの名無しさん垢版2017/04/19(水) 22:22:01.02ID:/l6NHl5b
思わないなぁ
カプセル化って無駄を省いてわかりやすいものにして再利用しやすいよう作ることと思ってるからね

そもそもカプセル化はフィールドだけじゃない
インターフェースを用いて処理を委譲させるように設計してしまえばデータだけじゃなく処理を丸ごと隠蔽できるしオブジェクト間の依存関係も稀薄にできる
0260デフォルトの名無しさん垢版2017/04/19(水) 22:26:31.08ID:lCKuRFX1
>>259
なるほどね、それはあるね
0261デフォルトの名無しさん垢版2017/04/19(水) 22:27:13.48ID:lCKuRFX1
カプセル化完全に理解した
0263デフォルトの名無しさん垢版2017/04/19(水) 23:01:17.77ID:KzpInSVx
>>256
通りすがりだが、年齢フィールドとか一定の幅に制限したい時に勝手に300歳とか設定されたら困るだろう。
だからprivateにしてメソッドやプロパティで0-120なりの範囲に制限するようにするんじゃないの?
0267デフォルトの名無しさん垢版2017/04/19(水) 23:13:00.35ID:HSKBgTxb
「300歳なんてあるわけないからカチカチに型で数字の範囲を絞ればいいんだよ」
「300歳なんて異常な数字を送らないように送り手が責任を持つべきだ」
「300歳が送られてきても"数字がおかしい"って返事するようにすれば良くね」

どれがいいと思うかで、その人のそもそものスタンスとセンスがわかるな。
0271デフォルトの名無しさん垢版2017/04/19(水) 23:21:42.97ID:HSKBgTxb
ちなみに最後のがいちばんオブジェクト指向っぽくて
大きな仕様変更に強いゆるさがあると思うけど
カチカチが好きなタイプのプログラマーは"ゆるさ"の部分が
許せないのだろうな。
0272デフォルトの名無しさん垢版2017/04/19(水) 23:23:56.87ID:KzpInSVx
>>264
え、でもそうでもなきゃ、データの外部でデータチェックとかは関数型言語や構造化プログラミング的な発想だけど。
副作用あるのに、その発想は危険過ぎない?
他の誰かがその外部のチェック用クラスを使ってくれる保証は無いよ?
0273デフォルトの名無しさん垢版2017/04/19(水) 23:30:11.23ID:qOdNs+TP
>>272
必要なら必要になったとき必要な人が自分で作れば良いじゃん、自由と自己責任の精神だよ、ルールで縛られたガチガチのオブジェクトじゃままならぬ事もあるでしょう!
0274デフォルトの名無しさん垢版2017/04/19(水) 23:33:14.31ID:KzpInSVx
>>267
オブジェクトが各々責任を持つとするなら、それぞれのクラスでデータチェック(ダブルチェック)が正解なんだろうね。
じゃないと、その二つのクラスは二つで一つになる。
依存関係が出来てしまう。
違うクラスでも、年齢に関するデータなら受け取れるようにした方がいいんじゃ無いかな。

実際には依存関係呑み込んでどっちかしかチェックしないってのが多そうだが。
0275デフォルトの名無しさん垢版2017/04/19(水) 23:34:21.76ID:HSKBgTxb
"誰がその数値に責任を持ってるか"っしょ。
それを明確にできてればそこを修正すればいいけれど
「私は知らない」「私は受け付けない」「私の責任ではない」って
例外の責任が見えないと責任者探しから始めなくちゃいけなくて
後から来たプログラマが死ぬ。
0276デフォルトの名無しさん垢版2017/04/19(水) 23:37:47.94ID:KzpInSVx
。。。オブジェクト指向は事なかれ文化の日本と相性悪いんじゃ無いかと思えてくる文言ダネ^^;
0278デフォルトの名無しさん垢版2017/04/19(水) 23:41:15.55ID:qOdNs+TP
ちゃんとオブジェクトが連携できてるかなって
そうだよ僕たちには結合テストがあるじゃないか
0279デフォルトの名無しさん垢版2017/04/19(水) 23:46:37.27ID:qOdNs+TP
値を変換するコンバータクラスと値をチェックするバリデータクラスがあれば良いじゃないか
責務の分離だよ
0282デフォルトの名無しさん垢版2017/04/19(水) 23:52:23.70ID:zPBwEPLo
連投せずにまずは落ち着くのが大事
0283デフォルトの名無しさん垢版2017/04/19(水) 23:57:15.78ID:/l6NHl5b
目的の動きを満たせばだいたい正解なんだから熱くなるなよ
自分の意見を押し通したいのはわからんでもないがな
0284デフォルトの名無しさん垢版2017/04/20(木) 00:29:25.65ID:jJkbXdni
208 デフォルトの名無しさん[sage] 2017/04/19(水) 12:20:37.70 ID:rIlDsUIc

継承もカプセル化もオブジェクト指向には必要ない
クラスを作る、つまり型を定義する事こそがオブジェクト指向

265 デフォルトの名無しさん[sage] 2017/04/19(水) 23:10:42.57 ID:2dTlCsss

>>208
代数的データ型で型を定義できるHaskellはオブジェクト志向言語だった……?

266 デフォルトの名無しさん[sage] 2017/04/19(水) 23:12:01.85 ID:qOdNs+TP

>>265
代数的データ型とはなんぞや?

269 デフォルトの名無しさん[sage] 2017/04/19(水) 23:19:37.80 ID:qOdNs+TP

type c = a or b
みたいな?

270 デフォルトの名無しさん[sage] 2017/04/19(水) 23:20:37.20 ID:qOdNs+TP

これもオブジェクト指向と言ってもいいでしょう!


こんなん草生える
0286デフォルトの名無しさん垢版2017/04/20(木) 11:36:45.75ID:vlFc/PD3
>>216
> ocpは耄碌したメイヤおじさんの考えだろ
> オブジェクト指向がブラッシュアップされる前の
> 無駄の塊だった頃の話だ
そうでもないけどね。
https://ja.wikipedia.org/wiki/%E9%96%8B%E6%94%BE/%E9%96%89%E9%8E%96%E5%8E%9F%E5%89%87
今でも、OOPの五大原則のひとつとしてあげられるのが普通。

> 最新のオブジェクト指向では継承もカプセル化も
> 害悪でしかないことがわかってる
そうなんだ、それは知らなかったよ。
0287デフォルトの名無しさん垢版2017/04/20(木) 14:18:44.61ID:Wfe8Hvf2
継承は特定の親に縛られすぎるのであまりよくないね。ってなってるが
カプセル化はむしろ危険な直接アクセスを防ぐ意味で常識になってる気が。
0289デフォルトの名無しさん垢版2017/04/20(木) 20:17:41.83ID:JH3XDWGN
>>287
でもカプセル化って汎用性悪いじゃん
変数1つアクセスできないだけで実現したいことできなくなっちゃうかもよ?
0292デフォルトの名無しさん垢版2017/04/20(木) 20:37:59.47ID:x1mUV01b
汎用性ならインターフェースと抽象クラスじゃねーの?
0293デフォルトの名無しさん垢版2017/04/20(木) 21:21:03.65ID:1ly+xIep
>>286

> 最新のオブジェクト指向では継承もカプセル化も
> 害悪でしかないことがわかってる

まーたくだらない嘘をつく
すぐにバレるのわかってるだろw

害悪でしかないならば、lintなどのツールで使うなって警告が出るはずだ。
そういったlintツールがない(継承やカプセル化を使った時にエラーにする方法がない)
もとから、害悪でしかないっていうのは完全に間違いだ。

反論があるならどうぞ
0294デフォルトの名無しさん垢版2017/04/20(木) 21:40:16.04ID:NBs+Bll8
>>289
それ汎用性ちゃうで。
そんな内部実装の細かいとこ勝手に使われたら、バグ修正すらなんの影響があるか怖くてできんくなる。
結局特定用途にしか使えなくなる。
0295デフォルトの名無しさん垢版2017/04/20(木) 21:44:56.84ID:1ly+xIep
結局、privateっていうのは、

この変数は外部から直接触ることを想定していません。
決められた値以外を入れた時の保証はしませんし、
将来の変更で互換性がない形に変更する必要がありますので
参照しないでください

とコメントで書くわかりに、コンピュータでも理解できる
言語で書くってだけの話なんだよね。
0296デフォルトの名無しさん垢版2017/04/20(木) 21:46:00.98ID:1ly+xIep
あ、もちろんprivateを使ったほうが良いって話だよ。

コメントで長々書いても読まないし、
ソースを見ないかもしれない。

そういう時にコンピュータでも理解できる言語で書いていれば
コンパイル時にしっかりチェックしてくれる。間違いがない。
0301デフォルトの名無しさん垢版2017/04/20(木) 21:57:23.53ID:x1mUV01b
>>299
反論がでない=正当性が証明された
などと言うつもりかい?
0304デフォルトの名無しさん垢版2017/04/20(木) 22:07:49.44ID:OWrdGWgc
カプセル化は正しい方向性だというのは賛成だが
lintで警告が出ないからという権威主義的な根拠はどうなのか
0305デフォルトの名無しさん垢版2017/04/20(木) 22:10:46.32ID:Rk6y34sG
>>290
構造体を使うとしてその構造体に連関する関数をどうやって整理する?

構造体ごとにファイルを分けるのは面倒だし、認知行動学的に考えて厳しくない?

整理することこそプログラミング、そのコストが低い言語が良い言語だと思うんだよね
0306デフォルトの名無しさん垢版2017/04/20(木) 22:12:10.00ID:NBs+Bll8
>>297
せやな。
必要性がないと判断したんなら使わなければいいんじゃないか?
間違ってないと思うで。

ただまあ、構造体が必要になる所では、ほぼ間違いなくクラス化した方が使い方の見通しが良くなるで。
0307デフォルトの名無しさん垢版2017/04/20(木) 22:12:52.70ID:x1mUV01b
自分で考えるってことをしないんだろ

他人の定めたルールが正当である
それが目に見える形とならねば虚構である

むなしいね
0309デフォルトの名無しさん垢版2017/04/20(木) 22:14:14.53ID:1ly+xIep
俺様が決めたルール(=害悪でしかない)が正当であると思ってるんだろうねw

だから俺様以外が決めたルールであるかどうかを確認している。
さて反論は?
0311デフォルトの名無しさん垢版2017/04/20(木) 22:17:39.49ID:x1mUV01b
>>308
おまえが満足するならそれでかまわないよ
別に誰かに認められるために学んでるわけじゃないし

もっとも残念ながら俺はカプセル化については推奨派なので反論とかするまでもなくどーだっていい
ただおまえの発想はかわいそうだと思うだけ
0313デフォルトの名無しさん垢版2017/04/20(木) 22:22:56.58ID:1ly+xIep
>>311
そういうことは最初から言わないか?

なんで俺に「反論がでない=正当性が証明されたなどと言うつもりかい?」と聞いた?
最初から「反論が言えなくても、正当かもしれないだろ!」と言えばいいじゃないか?

それがお前が本当に言いたいことだろ?

それならそれで俺は最初からこう答えるよ。
だから、お前が言っていることを正当だと他人に認めてもらうために、
お前は反論(信頼性があるソース)を出せって。

はい、で、信頼性があるソースは?
0314デフォルトの名無しさん垢版2017/04/20(木) 22:24:14.04ID:Rk6y34sG
それでもカプセル化は必要ない
lintはろくでも無いクラス設計がまかり通っていたときの負の遺産だ、javabeansやcomが盛んに作られた時代の名残だ、隠蔽して守られるより公開して守られるクラス設計を目指すべき
0316デフォルトの名無しさん垢版2017/04/20(木) 22:25:24.28ID:1ly+xIep
補足しておくと「継承やカプセル化が害悪でしかない」という仮説が
正しいという信頼性がある(俺様が決めたルールではないとう)ソースを出せ。
という話ね
0318デフォルトの名無しさん垢版2017/04/20(木) 22:27:09.43ID:x1mUV01b
>>313
見識が狭すぎるのは大変だよって言いたいだけさ

繰り返しになるけど俺はカプセル化について推奨派なので反論するつもりは全くない
おまえの論調は嫌いだがな
0319デフォルトの名無しさん垢版2017/04/20(木) 22:29:33.08ID:1ly+xIep
>>318
それを言うなら相手が違うだろ。

見識が広いやつに対して、
お前の広さを(証拠を出すことで)示してやれ!と言うべきだ。

それが俺も言っていることなんだけどなw

で、信頼性があるソースはよ
0321デフォルトの名無しさん垢版2017/04/20(木) 22:30:37.36ID:nIwh3CMn
ソースは?の問いに対して
有無以外のレスを繰り返す相手を
それ以上いじめてはいけない
0322デフォルトの名無しさん垢版2017/04/20(木) 22:31:02.97ID:Rk6y34sG
昔は暗号化のロジックも隠すことで安全性を担保しようとしていたけど、駄目だったんだよ、現代ではロジックを公開できる暗号化こそが真に安全性を備えていることがわかっている

それと全く同じことでいくらプライベートにしようがリフレクション使いまくる現代のプログラミングでは役に立たない、パブリックにしても問題ないように作るのが真のオブジェクト指向
0324デフォルトの名無しさん垢版2017/04/20(木) 22:32:34.93ID:x1mUV01b
>>319
そうかい
ならば俺にソースを求めることが見当違いだということにも気づいてくれ
0326デフォルトの名無しさん垢版2017/04/20(木) 22:33:55.62ID:1ly+xIep
>>322
その理屈を使いたいならば、ロジックは公開すべきある。
共通鍵暗号方式でも公開鍵暗号方式でも、秘密鍵(データ)は隠すことで安全性を保っている。

そのことから・・・と話をするべきだ。
0328デフォルトの名無しさん垢版2017/04/20(木) 22:37:17.66ID:x1mUV01b
>>327
だからカプセル化について推奨派って言ってんじゃねーか
推奨派が必要ないと考えるわけねーだろーが

少しは考えて発言しな
0332デフォルトの名無しさん垢版2017/04/20(木) 22:43:19.76ID:1ly+xIep
>>331
だから秘密にしたいデータ(他のクラスから参照されたくないデータ)は
プログラムに入れずにファイルにしておけってことだろ?
0333デフォルトの名無しさん垢版2017/04/20(木) 22:43:43.47ID:Rk6y34sG
>>328
派閥でどうこう言うんじゃなくていち個人として良心から発言していただきたい、カプセル化が必要ないんだという思いと向き合うべきだと言ってるんだよ
0334デフォルトの名無しさん垢版2017/04/20(木) 22:44:37.36ID:T8G8upSf
こいつ相当のバカだな
0340デフォルトの名無しさん垢版2017/04/20(木) 22:47:42.98ID:1ly+xIep
>>322
> 昔は暗号化のロジックも隠すことで安全性を担保しようとしていたけど、駄目だったんだよ、現代ではロジックを公開できる暗号化こそが真に安全性を備えていることがわかっている

違う違う。それは「暗号化ロジック」は公開しろって話なんだよ。

リピートアフタミー「暗号化ロジック」は公開しろ。

それ以外の話は公開しろって意味じゃない。
0343デフォルトの名無しさん垢版2017/04/20(木) 22:49:49.13ID:NBs+Bll8
password.txtに書いてgithubにコミットやろjk
0344デフォルトの名無しさん垢版2017/04/20(木) 22:51:10.30ID:1ly+xIep
>>342

暗号化ロジック = 式という形式のデータ

故に

式という形式のデータ = 暗号化ロジック

と言ってる?
それは明らかに間違いだよ。
0345デフォルトの名無しさん垢版2017/04/20(木) 22:53:29.90ID:1ly+xIep
式という形式のデータ、
そこにはいろんなロジックがある。
その沢山の種類のロジックの中で
暗号化ロジックだけは公開しろ
0346デフォルトの名無しさん垢版2017/04/20(木) 22:54:17.23ID:x1mUV01b
>>333
べき論はよくわからんが、そこまで言うなら個人として伝える

カプセル化は絶対必要である
なんならオブジェクト指向のキモだとも考える
目的に特化させ再利用できるようにデザインすること
きちんとネーミングすること
多様性を持たせるならばインターフェースを用いて処理を実装し移譲すればよい

以上
0350デフォルトの名無しさん垢版2017/04/20(木) 23:23:01.66ID:16AwdhdC
横からカプセル化の話題を眺めていたが、素晴らしいカプセル化のアイデアが湧いてきた!
0351デフォルトの名無しさん垢版2017/04/20(木) 23:29:07.88ID:jeWo4Dft
>>325
最初はクラスの下にでも書いたらいいよ
少なくとも中に書くよりは読みやすいし
後は必要に応じて慣れやね
0352デフォルトの名無しさん垢版2017/04/20(木) 23:49:33.09ID:hTP3eC2C
インターフェースこそオブジェクト指向だという意見に全面的に同意。
継承自体はクラス目線でモジュール化を進めた結果で得られる構造なだけであって、
インターフェースのように型を意識させることはない。
結果的にはインターフェース+基底クラスパターンが最強だと思うわ
0353デフォルトの名無しさん垢版2017/04/20(木) 23:59:45.86ID:zhxiAG0o
アルゴリズムを試行錯誤している時はグローバルな構造体の方が楽。
デバッグや保守の時はカプセル化されたオブジェクトの方が楽。
これはmutableとimmutableにも同じことが言える。

カプセル化しないmutableオブジェクトの方が考えやすいなら
プロトタイプ開発ではそうすればよい。
設計が決まったらできるだけカプセル化したimmutableオブジェクトに変えよう。
0354デフォルトの名無しさん垢版2017/04/21(金) 00:06:49.24ID:T1EM2She
>>351
関数の名前に構造体の名前を入れるん? 面倒じゃない?
0355デフォルトの名無しさん垢版2017/04/21(金) 00:08:09.71ID:T1EM2She
>>353
不変のものをカプセル化する意味あるのか?
フルオープンでよくね?
0357デフォルトの名無しさん垢版2017/04/21(金) 00:14:32.72ID:TFy/T03e
不変というのはコンパイル時に決まるってわけじゃないからな。
初期状態から変わらないってだけで、
初期状態というものは存在する。
当然それを隠したい場合も存在する。
0358デフォルトの名無しさん垢版2017/04/21(金) 00:26:21.96ID:Ck7s6rRh
>>354
そうか? 俺は元々Lisperだし、全く面倒とは思わん
でももし面倒と思うんなら、特にC++とかならオーバーロードがあるんだから構造体名入れなくてもなんとかなるでしょ
この先UFCSも導入される予定みたいだし
0359デフォルトの名無しさん垢版2017/04/21(金) 00:27:55.81ID:1EW2mi9U
びっくりするくらい低レベルな会話しててわろた
ホリデープログラマーが語りだすとこうなる
0360デフォルトの名無しさん垢版2017/04/21(金) 00:48:08.26ID:T1EM2She
>>356
どうして不変だからカプセル化するんだよ?
0361デフォルトの名無しさん垢版2017/04/21(金) 00:48:50.43ID:T1EM2She
>>357
なぜ隠すのか?
なぜ? どうして?
0362デフォルトの名無しさん垢版2017/04/21(金) 00:49:23.31ID:T1EM2She
>>358
LisperにとってJavaのクラスはどう?
0364デフォルトの名無しさん垢版2017/04/21(金) 01:18:33.36ID:Ck7s6rRh
>>362
個人的には作業効率が落ちる感じがして好きじゃない
でも低産階級労働者を縛る鎖としてはいいんじゃない?
0365デフォルトの名無しさん垢版2017/04/21(金) 01:19:22.96ID:T1EM2She
>>363
説明できないのな、じゃあいいわ
0366デフォルトの名無しさん垢版2017/04/21(金) 01:20:01.11ID:T1EM2She
>>364
バイアスがすごいな
Lisperはやっぱ屑だな
0367デフォルトの名無しさん垢版2017/04/21(金) 01:34:09.78ID:YTf7CJ3G
>>365
聞く耳持たないヤツに対して説明できるほど理解は深くないんでね
何度も同じことを繰り返しても仕方ない
0368デフォルトの名無しさん垢版2017/04/21(金) 01:43:34.54ID:T1EM2She
とどのつまりカプセル化は理解できないものなんだな?
0370デフォルトの名無しさん垢版2017/04/21(金) 02:04:34.66ID:T1EM2She
>>369
ホントだよ!失礼極まりないよ!
0371デフォルトの名無しさん垢版2017/04/21(金) 02:05:08.14ID:T1EM2She
低産階級労働者は傷ついているのです
0372デフォルトの名無しさん垢版2017/04/21(金) 02:05:31.65ID:T1EM2She
私は被害者です
0373デフォルトの名無しさん垢版2017/04/21(金) 02:06:19.45ID:T1EM2She
どうしてLispにはクラスがないんだろうか
みんなで考えてみよう
0375デフォルトの名無しさん垢版2017/04/21(金) 02:18:17.50ID:T1EM2She
>>374
でもクラスは便利ですよ
0376デフォルトの名無しさん垢版2017/04/21(金) 02:18:56.37ID:T1EM2She
クラスがない、つまりカプセル化もできない?
0377デフォルトの名無しさん垢版2017/04/21(金) 04:34:49.48ID:H6APCPmE
手続き型言語でも定数はグローバル変数でも問題無いんだし、関数型言語の変数はほぼ定数みたいなもんだし。
カプセル化の恩恵そのものがあんまり無い希ガス。
0378デフォルトの名無しさん垢版2017/04/21(金) 05:07:53.93ID:rPWpf+kQ
そもそも仕様書に書くべき問題をソースなんかに記述しようとするからこうなる

なんだよカプセル化って
ガキの使いでソースに手を入れようとしてるキチガイでもサポートしたいの?
ほらほらボクチンここprivateだから他のクラスから触れないからね!

チンカス過ぎる
0379デフォルトの名無しさん垢版2017/04/21(金) 05:56:50.07ID:67Y5mbs0
カプセル化はそもそも代入禁止じゃなくて隠蔽なんだが理解して書いてるのか?

SRP原則に則るならカプセル化のほうがいいに決まってる
0380デフォルトの名無しさん垢版2017/04/21(金) 06:07:38.30ID:H6APCPmE
なぜ隠蔽するかって言うと、不用意な変数の書き換えをさせない為。
関数型言語の場合は必ず変数の書き換え(と言うか再生産だが)を行うには関数を経由する。
変数を隠蔽したい場合は、パッケージで変数や関数単位で公開非公開を指定する。
0382デフォルトの名無しさん垢版2017/04/21(金) 06:13:30.88ID:rPWpf+kQ
例えばライブラリ提供者と使用者
使用者はライブラリ側のソースを一切触ることがなく
提供者は使用者側からの問い合わせや変更依頼を断れない
ここまで立場が明確なときに隠蔽は意味を持つが

すべての人間がどのソースもすべて変更する可能性がある環境で隠蔽は意味を成さない

と俺は思う
0383デフォルトの名無しさん垢版2017/04/21(金) 06:25:22.14ID:uAFMuOM4
>>380
それだと参照するだけならいいってことになっちゃうよ?
隠蔽するなら不用意な参照もダメだよね。
0384デフォルトの名無しさん垢版2017/04/21(金) 06:33:08.40ID:67Y5mbs0
>>380
隠蔽はその変数の操作をそのクラス内に限定するためにある
プロパティを介してprivate変数に代入や参照ができるようにしてるのもそのため
変数の書換禁止ならそれこそfinalつければ済む

>>382
>すべての人間がどのソースもすべて変更する可能性がある環境で隠蔽は意味を成さない
誰がいじろうとも修正箇所をクラス内に限定する意味はあるだろ
0386デフォルトの名無しさん垢版2017/04/21(金) 07:13:56.06ID:zhvS/nL7
車とタイヤをオブジェクト指向で表現する場合、車クラスにタイヤ属性を持つのが良いでしょうか

それぞれクラスを持ってる方が良いでしょうか
0387デフォルトの名無しさん垢版2017/04/21(金) 07:21:08.83ID:7DnA3IDC
>>383
マルチスレッドでも言われるが、参照だけなら基本問題無い。
上でも書かれている通り、隠蔽したければカプセル化じゃ無くても方法はある。

カプセル化と言うか、クラスと言う型に関数(メソッド)や変数(フィールド)を押し込めるのと、関数プログラミング的な考えはメリット/デメリットがそれぞれある。

クラスは依存関係が出来やすいが、GUIなどの多くの状態を保持するのに向く。
一方の関数プログラミングはデータと関数が分かれるので依存関係を少なく出来るが、状態を関数の引数として引き回すのでGUIに向かない。

関数型言語ではa = 1はそのプログラムではずっと1で、2が欲しければinc a とか、succ aとか関数の結果として2を受け取る。
0388デフォルトの名無しさん垢版2017/04/21(金) 07:23:34.62ID:fRfyQmKB
>>385
納品したら終わりってアプリを組むときにはカプセル化なんて確かに無用だけど
そもそもカプセル化とかその先のデータ抽象(抽象データ型)とかは、アプリが動いたり大規模化したあと
それをメンテしつつ運用(ちょっとしたバグ修正だけでなく、拡張や機能改変を含め)し続けるときに
それをやりやすくする技術だからなぁ…
0389デフォルトの名無しさん垢版2017/04/21(金) 07:24:52.21ID:YTf7CJ3G
>>385
個人開発ならばまぁわからんでもないが発想が危険すぎる
頼むからめんどくさいバグを作り込む前にプログラムから手を引いてくれ
0391デフォルトの名無しさん垢版2017/04/21(金) 07:38:01.69ID:rPWpf+kQ
>>389
お前のソースって読み手が完全な傍観者である場合は意味があるけど
ハイじゃあソースに手を入れなきゃねってなったときには超絶読みにくいんだろ
privateにした変数がクラス内グローバル変数みたいな動作してる典型だよね
0392デフォルトの名無しさん垢版2017/04/21(金) 07:40:08.56ID:uAFMuOM4
>>387
だからいくつかある方法のひとつがカプセル化なんだよね?

>>390実装依存しようとしている人間から実装を隠蔽するんじゃね?
0394デフォルトの名無しさん垢版2017/04/21(金) 07:48:52.81ID:uAFMuOM4
「実装依存しようとしている人間から実装を隠蔽する」

これ以上どう簡単に言えるのか?
0395デフォルトの名無しさん垢版2017/04/21(金) 07:59:35.17ID:YTf7CJ3G
>>391
ハイじゃあソースに手を入れなきゃねってなったときには超絶読みにくいだろ
publicにした変数がクラス外にも波及するグローバル変数みたいな動作してる典型だよね

どこまで影響すると思ってるんだ
調査、設計、対応、試験にかかる工数がとんでもない数値になる
0396デフォルトの名無しさん垢版2017/04/21(金) 08:21:01.29ID:rPWpf+kQ
>>394
全く意味がわからない
外部設計書とか内部設計書とか
以外の仕様書があってそれに基づいて作成してるの?
0397デフォルトの名無しさん垢版2017/04/21(金) 08:30:29.31ID:YTf7CJ3G
>>396
ところで全然わかってない自覚があるのになぜ不要と言い張れるの?
不要である理由を明確にしろよ
0398デフォルトの名無しさん垢版2017/04/21(金) 08:30:52.58ID:rPWpf+kQ
ていうか読み込んだデータに基づいて処理するも
ソースに記述した定数で処理するも仕様書次第じゃないの?
実装依存が何を指して実装依存って言ってるのかわからない
0402デフォルトの名無しさん垢版2017/04/21(金) 08:54:22.04ID:rPWpf+kQ
>>400
カプセル化の不要についてだね
おk

まず処理の動作は設計書に書くものだろう
ソースでprivateやpublicになってるからどうだってんだよ

ここで反論ある?
0403デフォルトの名無しさん垢版2017/04/21(金) 08:54:46.12ID:uAFMuOM4
実装がpublicだと他人がその実装に依存して良くないことがありそうだ。参照だけでもマズい。
だからprivateにして実装を隠蔽する。

これのどこに分かりにくい点があるというのか?
設計書とか仕様書とか関係なかろう
0404デフォルトの名無しさん垢版2017/04/21(金) 09:00:18.64ID:YTf7CJ3G
>>402
ある
利用者は仕様書を確認することなく意図しない方法で利用する

他は?
と言うか一度に全部言ってくれ
0405デフォルトの名無しさん垢版2017/04/21(金) 09:05:15.16ID:rPWpf+kQ
>>404
利用者って誰?
ソースを改変するソイツ(?)は設計書を記述せずに対象のクラスを変更しようとしてる?
ソイツのことを利用者と呼んでいてお前の環境では存在しうるの?
0406デフォルトの名無しさん垢版2017/04/21(金) 09:10:26.57ID:n31cY2TM
あぼーん
0407デフォルトの名無しさん垢版2017/04/21(金) 09:27:52.36ID:Ck7s6rRh
個人製作の観点からはカプセル化はいらんな
テンプレートか抽象タイプと多重ディスパッチあれば継承もいらんしミックスインもいらん
0408デフォルトの名無しさん垢版2017/04/21(金) 09:38:24.71ID:9S9WRWBb
>>405
実装する人が複数いる時、自分が作ったクラスのメンバ変数やメンバ関数を利用して
その人の担当クラスを実装する他人が自分のクラスの利用者だろう。
自分が作ったクラスも他人が作ったクラスも変更するのは作った人だけだ。

実装を一人で行える規模ではカプセル化の必要を感じないという話なら分かる。
でも前提なしでカプセル化は不要と主張したら大規模ソフトウェアも含まれる。
もしかして大規模ソフトウェアで必要かどうか全然考えてなかったの?
0409デフォルトの名無しさん垢版2017/04/21(金) 09:46:56.85ID:cmecYv9F
だからホリデープログラマーと話しても無駄やて
0413デフォルトの名無しさん垢版2017/04/21(金) 10:43:25.71ID:+U39WrXp
カプセル化されていると、メンバ変数とアクセサは分離され、外部のクラス利用者(ユーザコード)はもっぱらアクセサを呼ぶことになる。
仮にメンバ変数の実装の詳細を変更することになっても、アクセサを変更しない限り、ユーザコードは変更する必要はない。
間接層の導入による変更の局所化やね。

メリットと煩わしさの比較は人により異なりうるが、少なくとも必要なケースは少なからずあると思うが。
0414デフォルトの名無しさん垢版2017/04/21(金) 10:54:13.27ID:uAFMuOM4
せっかくカプセル化してもアクセッサなんか作ったら不自由になる。
変数を廃止したり形式の変更をしたりしにくくなる。
0416デフォルトの名無しさん垢版2017/04/21(金) 12:01:38.24ID:YTf7CJ3G
>>415
そうだよ
javaで言うならStringクラスの利用者はStringクラスの内容を変更しないだろ

いちいち立ち止まらずまずは全量を語ってくれ
0417デフォルトの名無しさん垢版2017/04/21(金) 12:12:59.55ID:T1EM2She
【全量】全体の重量。全体の容積。
0419デフォルトの名無しさん垢版2017/04/21(金) 12:41:44.49ID:rPWpf+kQ
>>416
ほうほう
だったら仮にそのクラス自体に手を入れることになった場合は
隠蔽対象者ではないということでおk?
0421デフォルトの名無しさん垢版2017/04/21(金) 12:52:42.74ID:3x8HXz+G
相手にしない方がいいよ時間と労力の無駄
ID:YTf7CJ3Gが楽しんでやっているならとめないけど
0422垢版2017/04/21(金) 13:05:41.49ID:KFYgHFHL
何十年前の話なのかわからなくなるな
0423デフォルトの名無しさん垢版2017/04/21(金) 13:27:43.71ID:T1EM2She
>>422
いつ何度でも話していいことだと思うが
会話ってそういうものだと思う

人の色恋沙汰なんて4000年前に語りつくされているが
今なお人の心をとらえて離さないだろ

オブジェクト指向にとってカプセル化とは
それくらいの魅力があるものだってこと

会話っていうのは昔々誰々がすでにいったことだから
言っちゃいけない、話しちゃいけないなんてもんじゃない

会話に入りたいって素直に言うべき、カプセル化やめるべきって
ちゃんというべき
0424デフォルトの名無しさん垢版2017/04/21(金) 13:46:02.03ID:YTf7CJ3G
>>421
ありがとう
うんこタイムの暇潰しなので大丈夫だよ

>>423
べき論はよくわからん
そんなことよりも不要である理由を早く『明確』にしてくれ
0425デフォルトの名無しさん垢版2017/04/21(金) 13:51:29.39ID:cmecYv9F
>>410
仕事の話ではなくオブジェクト指向の話だろ?
おれは1人で好きに作ってるからカプセル化なんていらねー!といわれても会話にならないよ
0426デフォルトの名無しさん垢版2017/04/21(金) 14:26:24.80ID:uAFMuOM4
>>425
それはそうだが、誰とどういうレベルで会話するのかってことだろう。
その前にホリデープログラマがどうたらってレスあるから。
0427デフォルトの名無しさん垢版2017/04/21(金) 14:50:09.12ID:T1EM2She
>>424
お前が明確にするんだよ、カプセル化やめるべきだって言うんだよ
お前の仕事だよ
0428デフォルトの名無しさん垢版2017/04/21(金) 14:51:20.94ID:T1EM2She
この業界趣味でやってる人の方が技術力高かったりするからね
サンデープログラマを馬鹿にしちゃいけない
0430デフォルトの名無しさん垢版2017/04/21(金) 15:33:45.46ID:I/U40a25
データのカプセル化なんてプログラム上どこまで触って(参照/代入)いいかの線引きを決まりごとからシステム的に制限したかの違いなだけでしょ
c言語のFILE構造体の中身を参照する事はないでしょ。stdio.hに定義されていても
それは暗黙的な決まりごとだからだし、それをアクセス修飾子で明示したのがカプセル化って言葉なだけで昔からの決まりごととしては変わらない
0431デフォルトの名無しさん垢版2017/04/21(金) 15:42:27.29ID:T1EM2She
>>429
どうして必要だと思ってるのか全量を言えよ、じゃないと理解できない
0432デフォルトの名無しさん垢版2017/04/21(金) 15:46:08.76ID:T1EM2She
>>430
その決まりが要らないものだったんじゃないかっていうのが
カプセル化害悪論の骨子なんだよ

暗黙的なものは暗黙的なままでよかったんじゃないか?
なぜ明示する必要があったのか、それによってプログラムが
複雑になることを受け入れるのか、プログラムがブラックボックス化することに
歯止めをかけてクリーンなオブジェクト指向を取り戻そうというのが
カプセル化害悪論のモチベーション
0434デフォルトの名無しさん垢版2017/04/21(金) 15:51:44.08ID:T1EM2She
>>433
聞き返したのは俺だ、ちゃんと全量を示せ、逃げるな
0436デフォルトの名無しさん垢版2017/04/21(金) 15:55:47.07ID:T1EM2She
>>435
捨て台詞まで吐いて逃げるのな?
0437デフォルトの名無しさん垢版2017/04/21(金) 15:56:28.58ID:T1EM2She
もういいわて、お前は漫才師か!
0439デフォルトの名無しさん垢版2017/04/21(金) 15:59:01.00ID:T1EM2She
はい逃げた、結局カプセル化を支持するやつって中身のないその場限りの
見栄を張って問い詰められたら逃げるだけの俄かなんだよな
0441デフォルトの名無しさん垢版2017/04/21(金) 16:01:35.09ID:I/U40a25
>>432
カプセル化害悪論ってのは一理あるし正しいと思うけどね
性善説と性悪説みたいなところだから正解はでないと思うし
ただ、このスレのカプセル化反対の意見はそんなレベルの話じゃない、そもそも議題のカプセル化の認識ズレの話なんじゃないのかな
0443デフォルトの名無しさん垢版2017/04/21(金) 16:14:29.43ID:9S9WRWBb
>>441
カプセル化反対の二人はカプセル化の利害を全然理解していないよね。
害があるからいらないではなく、わからないからいらないと言っている。
0447デフォルトの名無しさん垢版2017/04/21(金) 16:35:15.00ID:9S9WRWBb
>>444
例えば>>403がそうだ。
自分だけが使い仕様変更があったら変更するつもりのメンバ変数やメンバ関数は
勝手に他人に参照されたり呼びだされると変更できなくなって困る。
0449デフォルトの名無しさん垢版2017/04/21(金) 16:43:18.10ID:jkmg2197
カプセル化害悪論って、どっかで聞きかじった継承害悪論とごっちゃになってるんじゃないのか?
0450垢版2017/04/21(金) 16:49:15.74ID:KFYgHFHL
>>423
どちらでも無いと思うよ。少なくともどちらかへの「べき」ではない。
隠したいものは隠せばいいし、機械へのポカヨケを埋め込むのも今もうすでに実行不可なメモリみたいなどこのハーバードアーキテクチャだよみたいなの再発明してんじゃん。
0451デフォルトの名無しさん垢版2017/04/21(金) 17:12:45.41ID:9S9WRWBb
>>449
>>216はごっちゃにしているね。

実装継承は20年前に「継承より委譲」と言われていた。
その後のEJB2の複雑さの反動でPOJOブームが起きた。
でもカプセル化害悪論なんて聞いたことがない。
0452デフォルトの名無しさん垢版2017/04/21(金) 17:31:41.72ID:jkmg2197
>>199みたいな、ここまでがっちり結合したコードを良しとする人が、数万行程度コードを書いたらどんなことになるのか見てみたいわ
0453デフォルトの名無しさん垢版2017/04/21(金) 18:00:15.36ID:T1EM2She
>>452
おめーのコード出してもらおうか
俺はそれを複雑すぎるとさんざんにこき下ろすから
他人のコードにいちゃもんつけて自分のコードは出しませんなんて
そんなのありえないだろ、ベッドで女のパンツ脱がして
自分はスリーピースをぴっちり着込んでるようなもの
どちらが変態化は言うまでもないよね?
0454デフォルトの名無しさん垢版2017/04/21(金) 18:03:14.83ID:T1EM2She
>>451
やはりな、継承はオブジェクト指向に必要ないよな
POJOはたしかに話題にはなったが、まだJavaBeansの呪縛から
脱しきれてない過剰カプセル化によって逆に脆くなった
設計ばかりが出回った

いままでは聞いたことがなかっただろうが
もうお前は聞いたんだからこれからはカプセル化害悪論を
聞いたことがあるというべきだし、すぐれた設計だと
後世に伝えていくべき
0456デフォルトの名無しさん垢版2017/04/21(金) 18:05:19.93ID:T1EM2She
>>455
……
0457デフォルトの名無しさん垢版2017/04/21(金) 18:07:31.03ID:jkmg2197
>>453
別に俺が出すまでもなく、世の中にはそこそこSOLIDを目指したなかなかのコードが死ぬほど公開されてるんだが

> 俺はそれを複雑すぎるとさんざんにこき下ろすから
それらが読めないとしたら、それは複雑すぎる場合もあるだろうが、大抵は君のスキル不足だろうね
試しにgitfubから有名どころの1万行以上のプロダクトを選択してこきおろしてみたら?
0458デフォルトの名無しさん垢版2017/04/21(金) 18:11:31.05ID:YTf7CJ3G
>>454
>いままでは聞いたことがなかっただろうが
もうお前は聞いたんだからこれからはカプセル化害悪論を
>聞いたことがあるというべきだし、すぐれた設計だと
>後世に伝えていくべき

一切論じられてないよ
悪いんだけどどこらで論じてたのか教えてくれる?
0459デフォルトの名無しさん垢版2017/04/21(金) 18:11:49.39ID:T1EM2She
>>457
お前は俺のコードにいちゃもんつけたから
俺はお前のコードにいちゃもんつける
それてフィフティフィフティだ
さあ出してもらおうか、お前の全力を見せろ
0461デフォルトの名無しさん垢版2017/04/21(金) 18:13:54.37ID:T1EM2She
>>458
>>322 この辺とかすごくいい議論ができてるしとても有益でためになると思う
0462デフォルトの名無しさん垢版2017/04/21(金) 18:14:43.96ID:T1EM2She
>>460
お前は俺のコードにいちゃもんつけたから
俺はお前のコードにいちゃもんつける
それてフィフティフィフティだ
さあ出してもらおうか、お前の全力を見せろ
他人のふんどしで相撲取ろうとするな卑怯者
0463デフォルトの名無しさん垢版2017/04/21(金) 18:15:18.80ID:T1EM2She
とうぜんキャットドア問題を解決するコードだ
0464デフォルトの名無しさん垢版2017/04/21(金) 18:16:17.62ID:T1EM2She
結局キャットドア問題を解決できたの俺だけじゃん
カプセル化を導入してたらできてなかったと思う
俺は歴史の生き証人
0466デフォルトの名無しさん垢版2017/04/21(金) 18:17:51.34ID:T1EM2She
キャットドア問題をオブジェクト指向で解決してください
権威や数の力は不要だ、オブジェクト指向をわかっているなら
自力で解決できるはずだ
0469デフォルトの名無しさん垢版2017/04/21(金) 18:19:13.64ID:T1EM2She
>>465
で、キャットドア問題を解決するオブジェクト指向のお前が書いたコードは?
俺は書いたよ、お前にいちゃもんつけられたけど
だから、俺はお前が書いたコードをボコボコに貶してやる所存だけど
お前はその覚悟もできてるし受けて立つ実力もあるんだよな
じゃあコードを書いてもらおうか
0470デフォルトの名無しさん垢版2017/04/21(金) 18:20:45.36ID:T1EM2She
>>468
このスレにいて知らないはありえない
すれを検索すればすぐにでてくる >>6
0471デフォルトの名無しさん垢版2017/04/21(金) 18:21:06.06ID:T1EM2She
仕様にいちゃもんつけて逃げたりしてw
0472デフォルトの名無しさん垢版2017/04/21(金) 18:21:25.26ID:jkmg2197
>>466
>>199程度のコードなら、誰がどう書いても複雑にはならんだろ
俺の>>199の批判ポイントはSOLIDだ

OCPはダメダメらしいが、S,L,I,Dも駄目なら批判しなよ
0473デフォルトの名無しさん垢版2017/04/21(金) 18:21:43.58ID:T1EM2She
この手の手合いは他人を否定するけど自分では何も作れない木偶の坊と相場が決まってるからな
0474デフォルトの名無しさん垢版2017/04/21(金) 18:22:17.82ID:T1EM2She
さて、どんなコード書くんだろうな、楽しみだわ
0475デフォルトの名無しさん垢版2017/04/21(金) 18:23:03.71ID:T1EM2She
>>472
>>199は俺のコードだからパクっちゃだめだぞ、カンニングは卑怯な行為だからな
あくまで仕様を読んで作るんだぞ
0477デフォルトの名無しさん垢版2017/04/21(金) 18:24:37.49ID:T1EM2She
他人を否定すればするほど自分のハードルがあがるけど大丈夫なのかな
結局自分のコード書けないパターンをちゃくちゃくと歩んでるようだけど大丈夫なのかな
逃げ出しそうだぞ、大丈夫なのかな
0479デフォルトの名無しさん垢版2017/04/21(金) 18:27:35.87ID:T1EM2She
>>478
……
0481デフォルトの名無しさん垢版2017/04/21(金) 18:29:00.98ID:T1EM2She
……
0482デフォルトの名無しさん垢版2017/04/21(金) 18:29:47.23ID:T1EM2She
黙ってろって言われたから黙らざるを得ないのに
それで了解とか自己完結しすぎだと思う、病んでるよ彼は病んでるよ
0484デフォルトの名無しさん垢版2017/04/21(金) 18:30:38.43ID:T1EM2She
>>483
……
0485デフォルトの名無しさん垢版2017/04/21(金) 18:30:56.12ID:T1EM2She
俺のことは寡黙な人と呼んでくれ
0487デフォルトの名無しさん垢版2017/04/21(金) 18:32:01.93ID:T1EM2She
>>486
クソレスすんなハゲ
0489デフォルトの名無しさん垢版2017/04/21(金) 18:36:02.42ID:T1EM2She
ハゲもプログラム書けんの?
書けるんだったらオブジェクト指向でキャットドア問題に調整してほしい
0490垢版2017/04/21(金) 18:39:02.82ID:KFYgHFHL
あのドアってこういう話の発端から出てきた問題だったんだな。
オブジェクト指向で、ってそういう事か、なるほど。
ナンセンスだな。

何を以ってドアと成立するか定義できてるようで出来てない。
定義1を死守したければ、俺なら定義1は定義0の子クラスにして、定義2は定義1を継承せずに定義0から作るわ。
定義0は最終的にObjectに収斂する。

クラス設計を破壊せずに性質を追加ってのが矛盾してる。
ワイン樽と泥水の問題。
0491デフォルトの名無しさん垢版2017/04/21(金) 18:42:27.87ID:T1EM2She
↑こうやって仕様に文句を付けて
コードから逃げる人間は飽きるほど見てきた

オブジェクト指向のコードをかける人間はいないのか
0492垢版2017/04/21(金) 18:45:08.24ID:KFYgHFHL
>>491
俺どっかで書いたぞ
0493デフォルトの名無しさん垢版2017/04/21(金) 18:46:48.77ID:T1EM2She
>>492
それどこよ? どれよ? どこなのよ? どこーーー!!
0494デフォルトの名無しさん垢版2017/04/21(金) 18:47:06.08ID:T1EM2She
取り乱してしまいまして
0495垢版2017/04/21(金) 18:48:45.01ID:KFYgHFHL
もちろん、オブジェクト指向が役に立ちづらい、リアルな機械はそもそもコンポーネント指向で作るとも書いたし、コード自体適当なのも確かだが。
860 あ sage 2017/04/14(金) 08:00:23.71 ID:6kAIEFCu
ゴルーチンでドアとノブとストッパーとオートクローザーと個々に置いて、Channelで疎通させたらgoっぽい現実解になった。
ドアノブがあるとは限らんし、ドアノブとは別に鍵があるかもしれんし、とか思うと埋め込みではうまくいかんな。
この辺は機械と同じでコンポーネントにしとかないと後でわけわからん便利ボタン作られたときに面倒くさいと構えてしまったわ。
ラダーのほうがわかりやすいのかけるかも。
しかしideoneすげえな。
866 あ sage 2017/04/14(金) 10:26:30.48 ID:6kAIEFCu
>>862
http://ideone.com/yvttId
0496垢版2017/04/21(金) 18:53:00.35ID:KFYgHFHL
何でわざわざ関数作ったのに放棄してクロージャ変数にしてるか見たら、カプセル化がオブジェクト指向の専売でもなけりゃ普遍的に便利なものか気づくだろ。
0497デフォルトの名無しさん垢版2017/04/21(金) 18:59:03.34ID:T1EM2She
>>496
クロージャがカプセル化じゃないとしたら
カプセル化害悪論には賛成していただけるよね?
0498垢版2017/04/21(金) 19:05:27.23ID:dftFol4E
>>497
クロージャはカプセル化で、カプセル化害悪論には大反対だ。
カプセル化されてるから、ドアは責任を持ってイベントに対して好きなことを好きなだけできるし、他人はそれに関与せずにイベントの投げ合いで済む。
鍵のないドアだってあるんだから。
0499垢版2017/04/21(金) 19:06:54.30ID:dftFol4E
見せたくないものを隠すんだけじゃない。
見て不快なものが目に入らないようにするためにも使えるんだよ。
NHKの入らないテレビみたいなもんだ。
0501デフォルトの名無しさん垢版2017/04/21(金) 19:29:06.55ID:T1EM2She
>>498
カプセル化害悪論に反対しているとのことだけれども
もしクロージャがカプセル化ではないと仮定したら
カプセル化害悪論に反対する理由もなくなると思うんだよ

クロージャってどちらかというとローカル変数じゃない?
クロージャオブジェクトを使うところって関数内に限られると思うんだよ
そう考えるなら結局クロージャってローカル変数ってことになるわけじゃん?
だからクロージャを使ってもカプセル化害悪論には反しないんだよ
0502垢版2017/04/21(金) 20:03:29.23ID:qsriX73g
>>500
自分かも知れないし、他人かもしれないけど、それを考えたくない場面でそれが目に入らないようにしてる。
その関数以外書いてるときに、その関数なんて考えたくないじゃん。

>>501
だからクロージャは一つのカプセル化だって言ってるんよ。
ローカル変数って言葉が良くないが、ローカル変数には違いない。ただ、お前が思ってるローカル変数よりも限定的で、そして並行的だよ。
関数内に限られるわけではない。mallocして何かに帰そうが勝手だよ。
クロージャの中でいくつかのコールバックに渡したりするならなおさら。
つまるところ、オブジェクト指向のインスタンスのメンバ変数とあまり変わらん。
0504垢版2017/04/21(金) 20:17:17.21ID:qsriX73g
>>503
うん。書いてるから何?
書いてるから触ってはいけないとわかるはずだ、なら、無意味かつ実務知らなすぎだな。
書いてて触ってはいけないならば、触れることができてはいけないんだよ。本来は。
AppleのMacOSのUIのデザイン規約くらいの時代から書いてた話。
感電するよって書いてたら覆いをしなくたって良いなんて機械はありえないのと同じ。
0505デフォルトの名無しさん垢版2017/04/21(金) 20:22:47.97ID:YTf7CJ3G
包丁は料理にのみ使われるものだから傷害事件で扱われる刃物は包丁以外であるって理屈
0506デフォルトの名無しさん垢版2017/04/21(金) 20:32:03.02ID:rPWpf+kQ
>>504
じゃ、君の想定してる環境って

本来なら設計書を記述してから修正すべきなのに
それがやりにくい現場ってことでいいのかな?

カプセル化は設計書を記述する手順を踏んだとき役に立たない?
0507デフォルトの名無しさん垢版2017/04/21(金) 20:45:20.00ID:YTf7CJ3G
車のブレーキだけを踏んでたら全然進まないのでプレーキを踏んでもちゃんと進むように修理する工場だな
0509垢版2017/04/21(金) 21:04:20.97ID:qsriX73g
>>506
本来なら設計書を記述するどころか設計変更申請出して承認を経て設計書と設計変更書を出して、実装を変更して設計変更書から起こされた上がってきたテスト仕様書でテストして完了するけど、何もやりにくくないでしょ。

カプセル化は役に立つよ。担保となる元の設計書で使ってる部品の設計書を出来る限り見ずに済むし、
なんなら部品ごと新しく変えてもIFさえあってれば良い証左になるんだから。

>>507
プレーキとやらの定義が、踏めば進むというものであるならそう治すべく修理なり改修なりするわな。
このパンチメタルで穴が空いてる部品は共有部品で、AT車ならフットレスト、MT車ならクラッチペダルにつける部品の首がよく腐るから設計変更するなら、
押してクラッチが切れるかもしれない部品であり、押しても何も起こらない部品を同時に設計変更してる事になるが。
お前らのドアってこのパンチメタルの板くらいフワフワした定義。
0510デフォルトの名無しさん垢版2017/04/21(金) 21:09:39.74ID:rPWpf+kQ
>>509
設計書書いてるんだよね?

だったら今回の開発でそのメソッドを呼び出す奴は決まってる
今後増える予定を想定することの記述も設計書にはないでしょ?

この状態でprivateとpublicになんの意味があるの?
0511デフォルトの名無しさん垢版2017/04/21(金) 21:11:56.33ID:YTf7CJ3G
>>509
全面的に同意
ふわっふわしまくってるせいでカプセル化が害だとか言うバカみたいな考えなしの意見が出てくるんだと思う
0512垢版2017/04/21(金) 21:16:51.77ID:qsriX73g
>>510
呼び出すやつは決まってる、今後呼び出し方が変わる予定も無い。
ならばそいつはそれがインターフェイスで良いと思うけど、インターフェイスが無いわけではない。そいつがそのものであるだけで。
その上で、疎通にはこれを使おうね、これは使ってくれるなよ、と言う設計は無為味だし、むしろそうならばモジュラーにせずにそれごと機械に埋めてしまえとなる。
そうでは無くて、壊れたらこれだけ変えられるようにしとこう、とか、これだけを改良できるようにしよう、とか、
不具合が出たときに特定しやくすしとこうとなると、ある意味不自由を強制する形で決まった形で疎通させるのは当然でしょ。
お前のパソコンがノートパソコンならタッチパッドは前者、USBマウスは後者だよ。
0513デフォルトの名無しさん垢版2017/04/21(金) 21:25:56.38ID:rPWpf+kQ
>>512
何?次の開発を想定してるの?
よくわからないんだけど?

問題があったら設計書を修正してレビューしてソース修正する流れでいいんだよね?
0514デフォルトの名無しさん垢版2017/04/21(金) 21:29:21.44ID:JwbSy4qm
ここまでの流れで面白いのは>>414の視点だけ
カプセル化がどうの
その是非がどうのとはさんざん繰り返されがちだが

アクセッサ自体が意外と臭いよねって観点まで到達できる人は少ない
また、そこから先の議論についてもあまり見かけない
0515デフォルトの名無しさん垢版2017/04/21(金) 21:31:37.27ID:cmecYv9F
>>514
そもそもアクセサなんてものはモダン言語では自動生成なので論外
0517デフォルトの名無しさん垢版2017/04/21(金) 21:34:14.81ID:JwbSy4qm
その自動生成ってのを嬉しがる精神性が問題
アクセッサなんか書きにくいほうが健全
きみにはまだ伝わらないと思うし
これ以上言葉費やす予定もない
0518垢版2017/04/21(金) 21:35:03.27ID:AJ6tejAv
>>513
一般的に開発ってこんなもんだろ。
物理的な製造業から何まで、本来は。

問題があったら、設計変更の起案からだよ。
設計変更より作り直したほうが安くつくとか考えないといかんだろ。
ソース修正した後に、何を担保にしてその修正が妥当か、どういうテストが妥当かを定義するときに、組み合わせ爆発が起こらんようにIF定義するんじゃん。

>>514
アクセサのあるprivateなメンバなんか、ちょっと運が良ければチェックロジックなんか入ってるかも?運が悪ければ違う値まで変わっちゃうかも?みたいな、余計に面倒くさい奴だしな。
0519デフォルトの名無しさん垢版2017/04/21(金) 21:40:55.19ID:rPWpf+kQ
>>518
修正した設計書通りでしょ?
これがすべてに優先されるんでいいんだよね?っていうかそうじゃなかったらびっくりだわ

前のソースは関係ないよ
privateやpublicに意味なんかないよ
0520垢版2017/04/21(金) 21:44:00.25ID:AJ6tejAv
>>519
修正した仕様書の妥当性はどう計測して、修正したソースの妥当性はどう計測するの?
インアウトが確実に2つずつなら、ステートマシンでも組み合わせ数は知れてるだろうが、
インアウトの数が担保できなければそんなもの検証しようがない。
0521垢版2017/04/21(金) 21:46:20.92ID:AJ6tejAv
逆に言うわ。publicなものの組み合わせを検証する必要が本当に正しいと証明するためにはある。それはnCmで増える。
だから、組み合わせを減らしたい。
0522デフォルトの名無しさん垢版2017/04/21(金) 21:47:22.88ID:cmecYv9F
>>517
いーやわかってないのはおまえ
アクセサの必要性が低いなんてことは歴史的背景ふまえググれば中学生でもわかること
ではなぜ事実上、必須になっているか
そこまで考えてはじめて俺と同じ土俵に立てる
出直せ
0523垢版2017/04/21(金) 21:51:18.83ID:AJ6tejAv
>>522
アクセサは自動生成されるべきじゃないし、される言語も少なくないか?アクセサ作ったらメンバが生えるのはあるだろうけと。
0524デフォルトの名無しさん垢版2017/04/21(金) 21:51:19.37ID:TFy/T03e
publicフィールド = 何の制限もかけられないアクセッサだよ


つまりいずれにしろアクセッサ相当のものを使っているわけで、
問題はアクセッサがいるかどうか?ではなく、
制限をかける必要があるかどうか?

で考えたほうが良い。
0525垢版2017/04/21(金) 21:52:38.91ID:AJ6tejAv
>>521
意味わからん文になってた。証明するためには全パターンを網羅する必要がある、だな。
0526デフォルトの名無しさん垢版2017/04/21(金) 21:58:52.01ID:cmecYv9F
>>523
されるべきなんだよ
何故なら90%のメンバ変数はアクセサなんて必要としないから
残り10%のために手書きなんてバカらしいだろう
0528垢版2017/04/21(金) 22:07:30.53ID:AJ6tejAv
>>526
メンバ変数を見ればいいなら、メンバ変数見れば良くない?
アクセサがない限り、見れない書けない方が健全だとは思うが。

>>527
似てるようで違う。
設計書が正しいかが組み合わせ全てを用いないと証明できないし、設計書通りかどうかも同様に証明できない。
インが4本なら16通りだけど、10本だと1024通りだよ。
0530デフォルトの名無しさん垢版2017/04/21(金) 22:15:10.16ID:TFy/T03e
設計書が正しいことをきちんとテストする必要がある。

つまり、設計書のテスト仕様書が必要だ。

そしてそのテスト仕様書通りに設計書が
正しいかをテストする人間も必要になる。

そこで重用なのは、テストの手法である。
設計書が正しいことをどうやってテストするか?
つまり設計書を書いた人間への聞き取り作業である。

設計書に書き漏れがないか?設計書に書かれた言葉に矛盾がないか?
テスト仕様書に従って設計書を見ながら設計者を問い詰める。
これが設計書に対する優れたテスト方法である
0531垢版2017/04/21(金) 22:21:07.33ID:AJ6tejAv
揶揄してるようだが、設計書をテストする設計書にあたるものが、設計変更申請書だよ。
それはヒアリングやら検証実験やら、承認者の首やら、人の手で担保するもの
大規模開発した事ないのかな。
0532デフォルトの名無しさん垢版2017/04/21(金) 22:22:18.55ID:cmecYv9F
>>528
アクセス制限をするのはアクセス修飾の役割だしアクセサがあろうと無かろうとそれは必要
だからモダン言語にはプロパティというものがある
プロパティに出来てpublic変数に出来ないことを考えればおのずとプロパティでいいよねという結論にたどり着くと思うがね
0533デフォルトの名無しさん垢版2017/04/21(金) 22:23:36.50ID:rPWpf+kQ
うーん
ぶっちゃけそれとカプセル化との関連が不明
もはや何を主張したいのか滅茶苦茶な気がするんだけど
0534デフォルトの名無しさん垢版2017/04/21(金) 22:24:22.02ID:TFy/T03e
> 設計書をテストする設計書にあたるものが

意味わからん。

設計書をテストするものは、設計書のテスト仕様書だ。

つまりその設計には、○○の場合の処理は抜けていないか?
○○の場合に不整合は起きないか?
などというものが書かれいいるもので無ければ、
設計書のテスト仕様書とはよべない。
0536デフォルトの名無しさん垢版2017/04/21(金) 22:26:41.05ID:TFy/T03e
>>532
> アクセス制限をするのはアクセス修飾の役割だしアクセサがあろうと無かろうとそれは必要

アクセッサはアクセス制限ではなく、アクセスした後に入れようとした値が
正常値かどうかを判断するもの。
型だけでは表現できない特殊なルールを記述する所
アクセス修飾子は単にアクセスできるかどうかしか記述できない。
0537デフォルトの名無しさん垢版2017/04/21(金) 22:32:34.16ID:cmecYv9F
>>536
それは俺にレスするな
>>528の疑問に答えただけだから>>528にいえよ

俺の主張はgetter、setterの是非なんてものは時代遅れもいいところでその解がプロパティだろってことだけだ
0538垢版2017/04/21(金) 22:32:51.15ID:AJ6tejAv
>>532
プロパティはメンバ関数だよ。
C#ならIL見ればわかるけど、確かアンスコついた変数出来てる。
プロパティ自体もフツーに関数。
何で見えない変数が必要なのか、ってのは、副作用があるプロパティを書くことが出来る限り不必要にならない。
Queueみたいなもののgetのアクセサが、デキューして返すみたいなコードだと、デキューせずに先頭を見る方法が無くなる。

>>534
段取りがおかしい。「設計書のテストの仕様書」が成立するためには、「設計書の設計書」が必要。
なぜならば、テスト仕様書は実装からではなく、設計書から作られなけれいけないから。
「xxの処理は漏れていないか」は「xxの処理が必要だと定義されている」から書ける。
そのための要件は、すり合わせと設計変更申請のレビューと相手方、担当者の連名の捺印で担保する。

>>535
あるよ。
組み合わせが妥当な手段ではこれ以上ないと言う事が、数が少なくなればなるほど簡単になる。
0539デフォルトの名無しさん垢版2017/04/21(金) 22:34:09.19ID:TFy/T03e
>>538
> なぜならば、テスト仕様書は実装からではなく、設計書から作られなけれいけないから。

設計書を書く → その設計書のテストを書く
何の問題もないじゃないか
0540垢版2017/04/21(金) 22:34:35.69ID:AJ6tejAv
>>537
getter,setterとプロパティってシンタックスシュガー以上の違いある?Kotlinとか、getterとsetterを暗黙のプロパティに変換してくれるが。
0541垢版2017/04/21(金) 22:35:44.20ID:AJ6tejAv
>>539
おまえふざけんなよw
0542垢版2017/04/21(金) 22:37:04.70ID:AJ6tejAv
実装してからのテスト作成って何の意味があるのか意味がわからん。
0546デフォルトの名無しさん垢版2017/04/21(金) 22:45:28.27ID:cmecYv9F
>>538
んなことはわかってるっつーの
だからなんだよ
getter setterなんていらねーよという話から始まってる議論になんの関係がある
0549デフォルトの名無しさん垢版2017/04/21(金) 22:52:25.01ID:1EW2mi9U
おまえら相変わらず低レベルな会話してんなww
0550デフォルトの名無しさん垢版2017/04/21(金) 22:54:33.29ID:JwbSy4qm
アクセッサの記述性は、下に行くほど上品とする
すでに酒飲んでこれ書いてるから、異論の必要は無い

public string Name {get; set;} // C#
public string Name {private get; set;} // 多少制限
public string Name {get; private set;} // 多少制限
attr_accessor :name # Ruby
attr_reader :name # 多少制限
attr_reader :name # 多少制限
public int getName() {return name;} // Java
public please forgive me int getName() {return name;} // 仮想OOPL-A
puloccinaucinihilipilification int getName() {return name;} // 仮想OOPL-B
// ↑インテリセンス的なものも当然禁止、emacsのabbrevもなぜか効かない設定
0552デフォルトの名無しさん垢版2017/04/21(金) 22:57:14.58ID:cQz9sGMN
至高の言語はswiftだよ
swiftが全ての正解
0555デフォルトの名無しさん垢版2017/04/21(金) 23:15:04.82ID:IMFbV+tE
実際に不正な操作がされていないということを保証できるから

設計書ベースだと、オブジェクト使うときは
規約をしっかり読んで、それに抵触しないよう用心してコーディングし、
変なことが起こった時
設計書の記述みて、コード上でオブジェクトの使用箇所全部洗って、
操作の規約が守られてるかどうか逐一人間がチェックして、
それではじめてprivateの一言と同じ成果となるのだ

やってられんしそもそも間違えるし
0557デフォルトの名無しさん垢版2017/04/21(金) 23:16:16.72ID:fRfyQmKB
>>378
たとえば、インスタンス変数aに依存&結構コストのかかる計算で決まる値bがあったとき
bをインスタンス変数bにキャッシュしておくほうが得だよね?
publicにしたaの変更をどうやってフックするの?
0559デフォルトの名無しさん垢版2017/04/21(金) 23:24:54.21ID:1EW2mi9U
>>551
普通の人間には無理w
ID:rPWpf+kQは頭の出来が異次元すぎるwww
0563デフォルトの名無しさん垢版2017/04/21(金) 23:34:32.77ID:V+qA1SkC
>>393
dllやクラスファイルの形で、コードの無いクラスもあるんやで?
クラスやメソッドは紙やWebのみってのが。
0565デフォルトの名無しさん垢版2017/04/21(金) 23:48:31.04ID:go/6WchZ
>>557
ずれたコメントさせてもらうが、俺ならそのbを計算した都度出力して、自らはキャッシュしない方策を考えるな。
0566デフォルトの名無しさん垢版2017/04/21(金) 23:52:18.75ID:YTf7CJ3G
>>564
よく考えて発言してね
まぁ自分がバカと認識してるだけマシだけど

dllで提供されたものが他のものに依存してて単体で動かないとか、動くけど他のdllで得るはずの値を利用すること前提だとしたらその前提を知らない奴はうまく使えない
内部の処理を隠蔽し独立した動きを提供すればいいだけなんだよ
0567デフォルトの名無しさん垢版2017/04/21(金) 23:53:01.61ID:V+qA1SkC
ん?
カプセル化でprivateしてないと勝手にフィールド書き込んでしまう恐れがある。
コード無いからprivateにする意味ある。
そんな例。

あ、publicなフィールドを紙やWebに書かなければいいと言うのはなしね。
ツールが抽出するんで。
手書きじゃ無いんで。
0568デフォルトの名無しさん垢版2017/04/21(金) 23:54:06.38ID:Ck7s6rRh
エンジニアガイジさあ…… 住処が荒廃したからってここに雑魚狩りに来るのやめなよ
0570デフォルトの名無しさん垢版2017/04/22(土) 00:28:58.48ID:OS/5Qg75
>>554
設計で呼び出し元に制限を規定するのであれば、試験仕様書には制限外の呼び出しはNGの試験が用意される
上記を満たす実装はカプセル化と呼ばれるのでは?
0574垢版2017/04/22(土) 11:07:46.29ID:HbmQ/gQM
>>568
うーん、ノセられてしもたわ。そもそも論で焼け野原にするのは好ましくはないな。
気をつけよう
0575デフォルトの名無しさん垢版2017/04/27(木) 12:52:25.26ID:FdhNErTM
部品として使う場合、知識が要求されるのが、ちと時代おくれかなー
0576デフォルトの名無しさん垢版2017/05/02(火) 18:17:11.49ID:VYotzEOG
カプセル化、継承、オブジェクト指向設計論に熱が入るやつは
そろそろ自分が動的言語童貞だと熱弁していることに早く気がついたほうがいい
0577デフォルトの名無しさん垢版2017/05/02(火) 18:21:39.30ID:Bg5rWx47
>>576
動的言語が得意な人は、オブジェクト指向にとって大事なことは何だと思うの?
0583デフォルトの名無しさん垢版2017/05/18(木) 13:53:51.24ID:V9vRGfQu
マジでクラスの分け方教えてくれどう分ければいいんだよ
分けたとしてもどのクラスにどうデータ持たせて
クラス間の受け渡しとかどうすんだよ全部ゲットセットでpublicにしてええんか
0586デフォルトの名無しさん垢版2017/05/18(木) 18:14:11.48ID:pcJKb7uP
>>583
ゲットもセットも要らない
全部パブリックフィールドでダイジョブです
カプセル化はオブジェクト指向に不要な概念と言っていいでしょう
0587デフォルトの名無しさん垢版2017/05/18(木) 19:11:55.79ID:me+sOo3Z
>>583
クラス分けで悩むならグローバル変数なくしてやりすぎなくらいメソッドを細分化してみたらいいよ
0589デフォルトの名無しさん垢版2017/05/18(木) 23:04:55.06ID:yt/el+BP
>>583
世の中の仕組みと一緒だ。
社長が部下に指示を出す。
部下は結果を返す。
社長は、別の会社と連携してサービスを広げていく。

全ては機能を有していて、機能同士が連携してより大きな機能を作っていくだけだ。
0590デフォルトの名無しさん垢版2017/05/19(金) 02:05:14.71ID:879cm/wV
>>583
日本語的な表現でクラス分けをやるとしたら
「いくつも仕事をしていないこと」というのが目安だろうか

例: 「入力値のバリデーションやる」「設定ファイル読んでパラメータ保持」
怪しい例: 「ユーザー設定をDBから読んでパラメータに基づきUIをイジくって表示する」

数値的な目安が欲しいなら、パブリックメソッドが7以上あったら
そのクラスは複数の仕事を抱えている可能性があるんで、分割を検討する
まあ共通で使うクラスが太ってしまうことはよくあるけど
7ってのは平均的な人間がチラ見でパっと暗記できる事柄のリミット値
0591デフォルトの名無しさん垢版2017/05/19(金) 19:43:17.99ID:7xgwPeWo
>>583
MVCモデルとかアーキテクチャで調べる
依存性の注入で調べる
完全コンストラクタで調べる

この辺り守ってれば自ずと決まる
0592デフォルトの名無しさん垢版2017/05/19(金) 20:11:31.04ID:LqS/uk9i
オブジェクト指向って「学び」がないんだよな
文法が全て同じになって処理のパターンみたいなのが
すべて「名前」で隠蔽されて見えてこない。
処理の委託元のコード追ってもたらい回しにされてる感じで
「実際の処理」がどこにあるのか埋もれてしまってる状態になる。
0596デフォルトの名無しさん垢版2017/05/20(土) 18:54:10.07ID:urI3JAo7
まあ実際の処理を隠蔽するのがまさに1つの目的だし
たらい回しというか参照辿って芋づるで引っ張れる設計じゃないし、むしろそこがオブジェクト指向のキモだからな
0597デフォルトの名無しさん垢版2017/05/20(土) 19:17:55.25ID:mYqGvY+G
実際の処理が見れないと困るケースがもしあれば
設計が既に破綻してるって話だわな
0598デフォルトの名無しさん垢版2017/05/20(土) 20:09:39.79ID:1WQ4/ic9
役員が下っ端社員の細かい作業手順を知る必要ないからな。
ちゃんと結果報告が上がってくれば作業手順は他の人間に影響を与えてなければ関係無い。
0599デフォルトの名無しさん垢版2017/05/20(土) 20:38:10.12ID:POVmnKPN
オブジェクト指向は総活躍社会
0600デフォルトの名無しさん垢版2017/05/21(日) 01:27:28.98ID:Fqssqcja
>>597
図面的な意味で設計どうこうじゃなくて「なんかバグ出てるのはわかるんだけど
誰が調べても原因がわからん」系の状況じゃね?

継承四連打キメてて3段目で特定のタイミングのみ変数上書きワロスみたいな……
0602デフォルトの名無しさん垢版2017/05/21(日) 10:57:27.44ID:8IHB32RP
>>600
597じゃないけどそういうのは設計が破綻していると言うと思う
図面の設計て意味じゃなくて作成者のプログラミング設計って意味で
0603デフォルトの名無しさん垢版2017/05/21(日) 12:54:25.54ID:W3P4J6B5
世の中のソースコードの90%の多段継承は既に破綻してる、もしくは今後するけどな
つまり仕組みが糞
0604デフォルトの名無しさん垢版2017/05/21(日) 17:51:03.66ID:/ema5D/U
>>600
結局、オブジェクト指向ってただ作るだけなら得意なんだけど
正しく作っているか確認することは苦手なんだよね

そりゃあ設計はあるだろうし、設計通りに作られていれば問題ない。
でも設計通りに作られているのかの検証は、より困難になっている。
0605デフォルトの名無しさん垢版2017/05/22(月) 12:24:20.53ID:D5FtIlcH
なんか"経理部に領収書出して「清算お願いします」ってシステム"に
延々「経理部が不正やってないとも限らないよね!検証できないよね!」って
無根拠にただ喚いてる奴がいるみたいになってて相手のしようがないんだが、おまえ。
0610デフォルトの名無しさん垢版2017/05/22(月) 22:48:06.26ID:rXkCxzW6
やっぱりどっちもいらない
0611デフォルトの名無しさん垢版2017/05/24(水) 19:52:46.15ID:E7SQQ2ii
>>607
ゲッタセッタが生えてるプライベートフィールドはパブリックと変わらないってことだろう
要するにそれはカプセル化とは言わない
それやるぐらいならむしろパブリックの方がゲッタセッタの裏で余計なことしてない保証になる
0614デフォルトの名無しさん垢版2017/05/24(水) 22:22:46.76ID:mgEFkV8x
メソッドオーバーライドやインターフェース実装(具体例はJavaのinterface)も一応カプセル化の範疇だろうが
どっちかってと「継承」とか「クラス図」とか「デザパタ」の文脈で話す場合が多いかも
0616デフォルトの名無しさん垢版2017/05/25(木) 00:11:42.62ID:W6ilo8po
詳細を隠し、結合度を弱め、変更に強くする、だっけか?
ただ、まあ面倒い

C#の新しいプロパティ構文がJavaでも使えればいいのにな
0619デフォルトの名無しさん垢版2017/05/25(木) 14:20:37.34ID:R5hiuhFH
>>611
データの整形はいずれにしても必要なわけで問題はどこで整形するか
クラス外で何カ所も整形の処理書くよりプロパティ内に書いた方がいいよね
0620デフォルトの名無しさん垢版2017/05/25(木) 21:00:55.82ID:a5WTl5cb
>>619
ゲッタセッタで公開されたプライベートフィールドと、書式化された文字列を返すプロパティって全然別物じゃんアホなの
0621デフォルトの名無しさん垢版2017/05/25(木) 22:16:33.15ID:06hv3Ht1
>>611
SetterGetterの殻に閉じこもってプログラミングする安心感は異常

そんな保障してなんの役に立つ
どのみちオブジェクトを関数の引数にしたら、どこで何されるかわかったもんじゃない

publicにしたら処理をフックすることもできない
へんな値が設定されたときに例外をだすこともできないし
Audio.volumeでボリューム設定なんてこともできないだろう
0622デフォルトの名無しさん垢版2017/05/26(金) 12:49:01.87ID:nbqvOpds
セッタゲッタ作って役に立ったこともあるだろうが、無駄にコードが増えただけのこともあるだろう
無条件にやるのはただのバカ。フックいれることが予想される場合にするのはいい
0624デフォルトの名無しさん垢版2017/05/26(金) 15:13:04.21ID:FvwfjnU+
そのクラスのユーザが自分だけじゃない場合は、とりあえず全部privateにして、getter/setter作っといた方がいいね
0625デフォルトの名無しさん垢版2017/05/26(金) 16:21:29.95ID:Heb9aC5z
getter,setterを通じて変数に触れるのであればそれはもはやprivateとは言えないと思ってる
0627デフォルトの名無しさん垢版2017/05/26(金) 16:37:50.24ID:FvwfjnU+
>>625
> getter,setterを通じて変数に触れるのであればそれはもはやprivateとは言えないと思ってる
言いたいことはわからなくもないが、クライアントコードとそのクラスの接点がsetter/getterであると
保証されていれば、内部構造の変更は自由になるというのが異なる。
0628デフォルトの名無しさん垢版2017/05/26(金) 18:31:35.52ID:Heb9aC5z
確かにね
言ってることはよくわかる
だとしてもsetterは用途が限られるように感じてる

それならインスタンス生成時に必要な情報を全部ぶち込んじゃえばいいんじゃね?と最近考えてる
0629デフォルトの名無しさん垢版2017/05/26(金) 19:19:04.64ID:grHVRT/B
class1
{
public int setInt;
public string setStr;
}

class2
{
public int setInt { set; get; }
public string setStr { set; get; }
}

この2つの違い教えて
外のクラスから参照・変更するだけなら同じ扱い?
0630デフォルトの名無しさん垢版2017/05/27(土) 10:49:30.96ID:ieplBCy2
>>626
後でconfigの類を入れるとか、setLoggerだとかで
必要になる場面がたまにあるかも

なおPythonでそれやろうとしてプロパティデコレータ使おうとしたら「setだけのデコレータはない」というので
またPythonの俺様仕様か……って閉口した
0631デフォルトの名無しさん垢版2017/05/27(土) 10:59:35.13ID:u9alIOxt
setterだけってことは

obj.x = 1 #=> これは出来る
obj.x #=> 例外

になって欲しいってことか?イラネ
0633デフォルトの名無しさん垢版2017/05/27(土) 11:16:48.16ID:ieplBCy2
>>631
obj.config = user_config

みたいなのだ
setconfig(user_config)でもよろしかろうが、readwriteとreadは機能としてあるけどwriteはない
なんて片手落ちはあんまり想像してなかった
「正しいやり方はwriteイラね」とかマニュアルに書けってよ
0634デフォルトの名無しさん垢版2017/05/27(土) 11:58:55.24ID:0+MwcC+M
getter,setterはメソッドなのでクラス中で処理してクラスとして必要な形で出し入れできる
直接さわることとは別物だよ
0635デフォルトの名無しさん垢版2017/05/27(土) 12:19:45.90ID:HaHIN1I5
>>634
それはみんな分かってるんじゃないかな
>>583あたりからの流れで、全部のフィールドにゲットセット持たせることの是非を言ってるんだと思う。

フィールド(メンバ変数)が複数あったとして、ゲットセットする需要というか意味があるのは
ごく一部なんじゃないか。
0636デフォルトの名無しさん垢版2017/05/27(土) 12:38:09.02ID:ieplBCy2
理想: getter/setterはメソッドとすべき
setterで引数のチェック、getterでoutはコレであってるかのチェックはもれなくやるべし

現実: やらなくてもだいたい例外が飛ぶか動かないかするからわかる
0637デフォルトの名無しさん垢版2017/05/27(土) 12:45:31.51ID:5/vhXFvj
ないとバカが騒ぐから作っておけばいい
こんなつまらん事でわざわざバカにエサを与える必要はない
0638デフォルトの名無しさん垢版2017/05/27(土) 17:30:05.68ID:N4GV+Pp+
ゲッタセッタにフックさせる「かもしれない」をどう受け取るかによるから不毛と言えば不毛
柔軟に拡張できると受け取れば良しとなるし、不要な可能性を残すと受け取れば悪しとなる

個人的には単純にゲッタセッタで命名しといてくれるとインテリセンスでプロパティ探す時楽だからあった方がいい
ただゲッタセッタで命名しときながら裏で全然関係なかったり重い処理してる糞コード書く奴が一定数いるのも現実
0639デフォルトの名無しさん垢版2017/05/27(土) 17:46:00.50ID:3Q4GI2w6
クラス設計が下手くそなオブジェクト指向初心者なんだけど、ためになる読み物とかないですかね?
cはある程度書ける
0641デフォルトの名無しさん垢版2017/05/27(土) 19:54:27.21ID:SDTaiU/Z
>>639
うまいやつに自分が作ったモデル添削してもらえ
一瞬で上級者になるぞ

本はしらん本よみまくったけど結局それだけだとだめだった
0644デフォルトの名無しさん垢版2017/05/27(土) 21:35:03.31ID:583uXQeo
>>639
変な意見だけどHaskellを勉強する。
割とマジで。
互いに疎とか、モナドとか高階関数は依存関係解消のヒントになる。
0647デフォルトの名無しさん垢版2017/05/29(月) 08:44:08.38ID:U7XwlEVB
構造化プログラミングとは
関数、if、whileを使ってプログラムを書くこと

誤解を恐れず言うならswitch、forは邪道です
0651デフォルトの名無しさん垢版2017/05/29(月) 12:11:45.18ID:vyxh58aI
>>647
wiki読んだけど、それぐらいの意図しか汲み取れなかった。

オブジェクト指向では、ポリモーフィズムとか使えるけど、それも結局はクラスでifしてるだけであって、たいして変わらないじゃんと思った。
0653デフォルトの名無しさん垢版2017/05/29(月) 12:24:48.88ID:KD+R0FhF
分かるだろ普通w
0654デフォルトの名無しさん垢版2017/05/29(月) 12:34:49.38ID:CxTrZaFu
何を基準に普通と言ってるかは知らないけど同じ扱いをしても振る舞いが異なる事だと思ってたからなぁ

ここを見てるとどれだけ自分の頭が固いかよくわかっておもしろい
0655デフォルトの名無しさん垢版2017/05/29(月) 19:29:07.89ID:w9I7HLjv
一回、アセンブラからやらせて
自分で自分が書いたスパゲッティをメンテするところからやらせねぇと
なんで生まれてどんなメリットを目指したかわかんねぇんじゃねぇの
ゆとりには
0657デフォルトの名無しさん垢版2017/05/29(月) 20:16:08.98ID:KNNrZWoY
いつまで経ってもオブジェクト指向の意図が理解できない変な人が湧き続けるスレで言うことか。
0658デフォルトの名無しさん垢版2017/05/29(月) 22:18:26.47ID:A34reMmc
オブジェクト指向の意図ってなんだよw
こんなものまで擬人化しないと気がすまんのかお前らw
キモいにも程があるwww
0661デフォルトの名無しさん垢版2017/05/30(火) 02:01:38.87ID:KOCwrIWS
>>652
同等じゃないよ

ポリモーフィズムはそもそも参照先が違う
演算によって処理を分けるif文とは全く違う
0662デフォルトの名無しさん垢版2017/05/30(火) 02:16:15.25ID:734VgA5Q
>>651
呼び出す側が適宜、相手のインスタンスに「こういう動作して」って派生クラスぶっこむ場合が多いな
まぁ派生元 - 派生先でifしてるって捉え方もできようが
if - elseが下に7コ8コ並んで見難いのよりはマシだろう
0663デフォルトの名無しさん垢版2017/05/30(火) 19:10:33.85ID:cuCpV+Ml
>>658
Objectの言葉の意味の通りじゃん
0664デフォルトの名無しさん垢版2017/05/31(水) 17:32:41.97ID:lwNSc7pn
オブジェクト指向開発の理解度を測るために民間団体の主催するJAVA検定を受けようと思うのですが、そもそもここの問題はオブジェクト指向となっているでしょうか

http://www.sikaku.gr.jp/js/jv/img/sample/1/jv1.pdf

過去に構造化プログラムとかクソ味噌言われていたので、オブジェクト指向に造詣の深い皆さんに評価して頂きたいです
0667デフォルトの名無しさん垢版2017/06/01(木) 03:12:10.50ID:TLZ7U8Co
>>664
実務でやるなら、4番のシーケンス図よろしく「N」なんて打ち込ませねぇ
そもそもあんなクソみたいな手数を踏ませるはイカれてるっていうか、ユーザーは怠惰なんス
一手で済ます
たぶんログイン画面でセッション(あるいは何らかの認証情報)を持たすのが前提だあな

っていうか「Fuckyou」とか「let me die」って打ち込んだ時どうすんだね
この図だと未定義だから何してもいいよね、俺だったら「Fuckyou」ってタイプされたら水龍敬ランド出すし
「let me die」ってタイプされたらガルパンのまほお姉さまのエロ同人誌でも表示してやるわさ
……冗談やで?

というくらいなんかアレかも
0668デフォルトの名無しさん垢版2017/06/01(木) 03:35:10.17ID:TLZ7U8Co
そしてまさかのNはユーザーの氏名でした、か(今アレって思って見直したら) orz ごめん手抜きした
まあいいや、見直すとして……ああうんお呼びでないか

シーケンス図を(マジメに)見る限り

・初めに二回ポップアップ出す(or二発画面遷移をせよってこと、メソッドが二発あるので)
・ユーザーがNっていれたら、初めに出たのとの同じポップアップを2発やる(displayFirstMess/displayPromptMessをもう一度ぶっぱしてるから)
・imputMessageでユーザーが入力をいれたら
 まずユーザー一覧を表示するのか、「検索方法を指定してください」と出すのかして(displayFirstMessはどうもでっかく二分岐してるのかもしれん、あるいはまた「検索方法を指定してください。」と出すのか)
 そのあとでallDisplayでドカっと下に長い表示を出すのか
 この辺要確認、たぶん書き手はそんなの想像してないと思う
 たぶんGoogle検索のようなのを想定してるはずなので
・ユーザーは表示された従業員名とID突き合わせて入力欄にID打ち込んでEってタイプする
 ここも確認が必要、クリックじゃねぇの?

ああうんこれメインフレーム時代のやり方やで
0669デフォルトの名無しさん垢版2017/06/01(木) 03:36:55.80ID:TLZ7U8Co
あーうん、let me dieって言われたらまほ姉がおっさんにピーされる機能は実装が必要だな
俺以外望んでないけど未定義だからいいよね(実務じゃしないよ、冗談だから)
0670デフォルトの名無しさん垢版2017/06/02(金) 01:49:27.48ID:w5TyDgot
今Haskellとの比較にPython/Rubyに追加で究極的なオブジェクト指向言語であるsmalltalkでコマンド作るべくgnu-smalltalk勉強中なんだが、条件分岐やループまでオブジェクトへのメッセージなんで、
squeak/PharoみたいなGUIなsmalltalkじゃない事でシステムブラウザ(動的クラスリファレンス?)無しじゃ相当厳しい。

Ubuntu Linuxでsudo apt install gnu-smalltalkしただけじゃgst-browser起動しなかったから、
tar玉落としてコンパイル段階から環境構築してやっと動いた。

んで思ったんだが、やっぱオブジェクト指向ってクラス覚えないと何も出来ないんじゃね?
中途半端なオブジェクト指向言語って構造化プログラミングの文法に助けられてて、
その辺誤魔化せてるだけのような気がして来た。
0671デフォルトの名無しさん垢版2017/06/02(金) 07:47:26.08ID:vc1fSB5M
>>670
システムブラウザまで使うならなぜGNU Smalltalkみたいな変わり種Smalltalkにこだわるのかわからんけど(何かPharoやSqueakじゃ駄目な事情が?)
クラス(というか組み込みのオブジェクト)の使い方を覚えないと何も出来ないというのはかなり正しい

ただそんなこともあってSmalltalk環境は相当早い段階から組み込みの(クラスを含む)オブジェクトに対する問い合わせ
つまりイントロスペクション機能やそれをサポートする(人間の短期記憶に負担をかけないようにする)
マルチウインドウシステムが発達したわけ

だから、繰り返すけどそれらの機構を大胆に削ったのウリのGNU Smalltalkで
「Smalltalk(やそれが体現するOO)が何か」を論ずるのはちょっと違うかもと老婆心ながら
0673デフォルトの名無しさん垢版2017/06/02(金) 08:32:54.40ID:uW9UgDbU
>>671
> 何かPharoやSqueakじゃ駄目な事情が?

すみません。ちゃんと理由が書いてありましたね。^^;
>>670
> コマンド作るべく

ただ最終的にGNU Smalltalkを使うにしても、まずはSqueakやPharoから入るのがいいかとは思います

>672
> アランケイにも捨てられたゴミ

アラン・ケイが Smalltalk を見捨てた発言をするのは宮崎駿の引退宣言みたいなもので
最初は1976年ごろからはじまって、10年ぶり5度目とかの恒例です
0675デフォルトの名無しさん垢版2017/06/02(金) 09:10:16.04ID:DxIdV4KE
SmalltalkはIDEがなきゃCよりも書きにくく、
IDEを使うためにはヘンテコなOSモドキの使用を強制され、
それを我慢して使っても他の言語より書きやすいわけでもなく
マイナー言語なのでライブラリも少ない

まさにゴミ
0676デフォルトの名無しさん垢版2017/06/02(金) 09:36:01.61ID:uW9UgDbU
>>675

まあそう言わんと

ただヘンテコなゴミだと簡単に切り捨てるより、いろいろ調べて学びを得た方が面白いですよ

同時期に登場したStar、Cedar、Interlisp-D等、同様のOSモドキはいくつか生み出されましたが、
結局生き残って今も使われ続けているのはSmalltalkだけです

たまたま選ばれたということ(ジョブズやゲイツがそのルック&フィールを模倣して広めてくれたということも含め)
もあるかもしれませんが、ホストOSに寄生する“異物”という宿命を背負いながらも変化を続け
趣味はあってもスタートアップで言語として選択される程度に有用であることは
ケイらの遅延結合性の徹底というコンセプトの有効性を示すよい例かとも


Smalltalkの底を流れる設計思想 - ダン・インガルス
http://web.archive.org/web/20041016084842/http://marimpod.homeip.net/chomswiki/24#

「ソフトウェア工学」は矛盾語法か? - アラン・ケイ
http://metatoys.org/oxymoron/oxymoron.html
0677デフォルトの名無しさん垢版2017/06/02(金) 10:52:54.67ID:PwRFjZu6
>>673
いあ、昔squeakやってたし、当時はクラスブラウザと自由自在Squeakあれば十分なくらい独学しやすい言語だと思ってた。
当時はJavaのクラスリファレンス(とら本)も分厚いのを上下巻2冊で売ってたし、クラスたくさん覚えて行くのが当たり前と思ってたからね。

HaskellもLispも、関数覚えておけば便利だけど、覚えてない知らない場合も自分で自作しやすい。
そう言う意味じゃCとかの構造化プログラミングも関数やクラスを基本にするんじゃなくて、Goto使わなくて済む構文によってスパゲティコードを無くすっていう自作し易さを目指す進化だったんよね。
0678デフォルトの名無しさん垢版2017/06/02(金) 11:34:30.40ID:PwRFjZu6
何というか、オブジェクト指向って出来合いの機能をたくさん用意する事で自作する機会を減らす方向の進化で、自作のし易さを加速させる、根源的な生産性を上げる進化じゃ無い気がして来たのよな。
0679デフォルトの名無しさん垢版2017/06/02(金) 11:53:23.75ID:ybQLwqcw
>>677
Squeakは経験済みでしたかそれは失礼いたしました

ただSqueak等でちょっと調べてみれば分かりますが、他の言語やそのIDEのやり方とは違いSmalltalk環境のGUIツールは基本
クラスを含むオブジェクトの持つイントロスペクション機能にちょっとしたGUIのガワをかぶせただけシンプルなしくみで動いています
それはつまりGNU Smalltalkでも、Squeak等が“GUIのガワ”が中でやっていることを式で書いてやればそれなりのことは事足りるということです

たとえば Integer >> #factorial というメソッドのソースが読みたければそれに methodSourceString というメッセージを送る
(Integer >> #factorial) methodSourceString
といった調子で、そしてこれがSmalltalkのシステムブラウザがやっていることのほぼ全てです

じゃあ、factorial や Integer はともかく、>> だの methodSourceString だのはどうやって分かるかというと
もちろん GNU Smalltalk のリファレンスをググるのも手ではありますが
#>> implementors で実装クラスを一覧したり、
#>> implementors anyOne methodSourceString で定義を見たりするのがSmalltalkでのやり方になります

覚えておくよりはその都度オブジェクトたちに尋ねるという彼らとの対話の妙をぜひお試しあれかし
0680デフォルトの名無しさん垢版2017/06/02(金) 12:43:16.45ID:ybQLwqcw
>>678
> オブジェクト指向って出来合いの機能をたくさん用意する事で自作する機会を減らす方向の進化

出来合いの(組み込みの)機能といっても、元は自作なんですよ(少なくともSmalltalkにおいては)
それらを簡単に実装できるという精神はHaskell、ひいてはFPに通じるところはあると思いますよ

それにHaskellにしてもパターンマッチや型クラスを含む型システムなどの便利な組み込みの機能の助けなしに、あるいは
リストなどのモナドの拡充なしに自作のしやすさの加速ができるわけでもないような気がしますが…違いますかね
0681デフォルトの名無しさん垢版2017/06/02(金) 12:44:30.15ID:AZK4Ab0s
>>677
オブジェクト指向は、複雑さ、巨大さとどう戦うかというのが進化の方向
HaskellやLispでデカくて複雑なプログラム書いてみたら、オブジェクト指向にも有用な部分があることを理解できるんじゃない?
ちょっとしたコードの書きやすさだけで言語の良し悪しは決まらないよ
0682デフォルトの名無しさん垢版2017/06/02(金) 13:19:41.98ID:E2RwPTWY
Objective-Cにも動的にクラスに「おまえなにできるの?」って聞くメッセージあるし
基本的にあの辺りはインターネットみたいな動作しっぱなしの世界で
クラスってノードを動作中に抜き差しするみたいな感覚を指向してるからなぁ。
0684デフォルトの名無しさん垢版2017/06/02(金) 13:27:17.37ID:PwRFjZu6
>>679
その都度オブジェクトたちに尋ねるのが、まさにsmalltalkがオブジェクト指向の最たるものの所以で、当時も今もそこについては変わらないんですけどね。
さすがにgnu-smalltalkでは一覧性に難ありな所が^^;

逆です。
その便利な機能のみで、入出力とかはともかく、自分がこう動いて欲しいと望む機能を実現できる。
そこに関してsmalltalkとFPに通じる所があるのも同意します。
ただあれはsmalltalkであってsmalltalkじゃ無いというか。。。

smalltalkって制御構造もメッセージで実現してるけど、Haskellと同じで構造化プログラミングを模倣してるだけで、やや普通のオブジェクト指向言語より構造化プログラミングから逸脱してる気もしますし、確かに生産性は高いんですけど。

ただ、既存の関数やメソッドを一切使わず新しい機能を実現する手間は、その基本的な便利機能の充実度から、Haskellのが生産性は高いかと。
探すより作った方が早い場面もありますし。
(いあ、smalltalkは探すスピード上げる方向の進化と考えれば、作った方が早いって場面も少ないんでしょうが)
0685デフォルトの名無しさん垢版2017/06/02(金) 13:33:45.72ID:PwRFjZu6
>>681
昔はGUI部分も同じ言語で書いてたからオブジェクト指向が有用だったですが、今はGUI部分はHTMLなりXAMLで書くことも増えて来ましたし、複雑な部分はDSLに任せて分担作業が、複雑巨大なプログラムに対する解の様に思います。
0687デフォルトの名無しさん垢版2017/06/02(金) 13:57:11.97ID:ybQLwqcw
>>684
> さすがにgnu-smalltalkでは一覧性に難ありな所が^^;
> ただあれはsmalltalkであってsmalltalkじゃ無いというか。。。

具体的にはどういったところがでしょうか? 後学のため教えていたければ幸いです

> smalltalkは探すスピード上げる方向の進化と考えれば、作った方が早いって場面も少ないんでしょうが

SmalltalkがOSモドキと忌み嫌われつつもイメージベースで居続けるのはこの利便性を捨てないためです
ユーザー定義のものも組み込みのものも区別せずにオブジェクトストアに保持し、OODBのように探せます
0688デフォルトの名無しさん垢版2017/06/02(金) 14:05:56.39ID:ybQLwqcw
>>686
実行時についてはそうなのですが、それを設計や運用時にも徹底する(それをサポートできるシステムであること)がミソです
決定をできるだけ先送りにして固定化しない、ぎりぎり直前でも(場合によっては事後でも)差し替え可能に保ちます
基本的な考え方はこちらに書かれていますのでよかったら読んでみてください

「ソフトウェア工学」は矛盾語法か? - アラン・ケイ
http://metatoys.org/oxymoron/oxymoron.html

アラン・ケイもよく言っていますが、これができるのはおそらくLISPとSmalltalkくらいかと
0689デフォルトの名無しさん垢版2017/06/02(金) 15:12:57.10ID:PwRFjZu6
>>687
あれ。
Squeakの時に低レベルのもの書く時って、それ用のsmalltalk無かったでしたっけ?
名前忘れたけど。。。

gnu-smalltalkみたいなのが主流にならないと、結局OSモドキに引き篭もって外とやり取りなんですよね。。。
例えば鯖のログを必要な箇所だけ見れる様に加工したいって時でシェルやLLが使われますが、smalltalkはその代替えにならない。
その為だけにOSモドキを立ち上げる手間が壁になる。

まあ、それはHaskellも微妙な立場なんですが、シェル知らなくても、各種LL(HaskellはLLじゃ無いけど関数知らなくてもって意味でHaskell自身の関数も含む)の関数やクラス知らなくても、Haskellなら、自分の発想でこういう加工したいってすぐに自作出来ます。
ただ、コンパイルが遅いので、LLとどっちが便利かが微妙になるだけで。。。

smalltalkはOSモドキと一体の生産性ですが、現実問題、言語は問題解決の手段であって、手段を使用する事自体に手間が掛かってしまっては元も子もないと考えます。

。。。Haskellもその点で微妙ですけどね。
(runghcでLLとして実行しても型検査はするから起動がLLより遅い)

Haskellのパターンマッチや遅延評価やモナドは作り手の知識が少なくても「作りやすい」仕組みだと感じます。
一方のsmalltalkは知識が少なくても「探しやすい」仕組み。
そう感じました。

LLはどっちも80点だけど、総合点で上回る的な。
でも規模が大きくなると型付言語が欲しくなる。。。
0690デフォルトの名無しさん垢版2017/06/02(金) 17:01:43.90ID:ybQLwqcw
>>689
> シェル知らなくても、各種LL(HaskellはLLじゃ無いけど関数知らなくてもって意味でHaskell自身の関数も含む)の関数やクラス知らなくても、
> Haskellなら、自分の発想でこういう加工したいってすぐに自作出来ます。

つまりHaskellでは組み込みの関数をいっさい知らなくとも(使わなくても)ログの整形作業が自作できるのですか?
それは驚きですね(反語的に)
0691デフォルトの名無しさん垢版2017/06/02(金) 17:24:22.28ID:PwRFjZu6
出来ますね。
結局ライブラリ使った方が早いんですが、学習しながら作ると言う意味では即戦力です。

だからなんだと言われればそれまでですが、GUIとかのライブラリがポトペタで作れたりしないので開発環境としてはまだまだですが、言語としての学習コストは低いと思ってます。
0692デフォルトの名無しさん垢版2017/06/02(金) 17:35:52.70ID:ybQLwqcw
>>691
そんなことが可能な言語がこの世に存在するとはにわかには信じられません
実際に動作するコードを見せてもらうことは出来ますか?
0693デフォルトの名無しさん垢版2017/06/02(金) 17:38:49.65ID:PwRFjZu6
あ、さすがに入出力関数は使いますよ?
でも、その中間の整形処理は一切組み込み関数知らなくても作れますし、その行為自体もそんなに手間じゃ無いです。
Cとかでもある意味整形処理は全部自作出来るわけですが、手間が全然違います。

smalltalkもそう言う意味では少ない知識で自前で作れると思いますが、ロジック部分に関してだけは、Haskellのがより少ない知識で済んでると思います。
GUIまで含めるとライブラリの塊と言うかライブラリそのものなsmalltalkのが生産性は高いんですが。。。

それこそsmalltalkそのものがOSとして普及しないとあんまり意味がないと言うか。。。
0694デフォルトの名無しさん垢版2017/06/02(金) 17:44:01.62ID:PwRFjZu6
>>692
もう出勤1時間前なので流石に今日は作れませんが、何かコードを提示して、組み込み関数を自作して行きましょうか。

上でも書いたですが、制御構造と最低限の入出力関数があれば作れはします。
手間の問題というだけです。
0695デフォルトの名無しさん垢版2017/06/02(金) 18:57:35.54ID:ybQLwqcw
>>694
> 今日は作れませんが、何かコードを提示して、組み込み関数を自作して行きましょうか。

おもしろそうですねぜひお願いします


> それこそsmalltalkそのものがOSとして普及しないとあんまり意味がないと言うか。。。

Dockerとかありますし、ホストOS内でOSモドキを動かすことにマシンパワーや心理的障壁は下がってきていると思いますので
「意味がない」と言うことはないと思いますよ
0696デフォルトの名無しさん垢版2017/06/03(土) 02:39:21.79ID:uXpVhTjv
中規模以上の範囲におけるDRY原則を
実現するための手段が
オブジェクト指向じゃないの?
そういう意味ではオブジェクト指向が
なくてもプログラミング出来る。
しかし重複部分を無くすには
オブジェクト指向しかないでしょ?
0697デフォルトの名無しさん垢版2017/06/03(土) 15:57:20.13ID:59j26kfv
>>695
たしかに、昔に比べれば仮想化が当たり前になりましたしそうかも知れませんね。
急ごしらえですが、昼間寝てしまったので3時から急ごしらえで作りました。
使い勝手悪いので、行番号振ったりと改良の余地ありです。

import System.Environment
import Data.List

filterOfLine word = unlines.(filter (isInfixOf word)).lines

main = getArgs >>= \(file:word:_) -> readFile file >>= putStrLn.filterOfLine word

IOな関数は全部mainの方にあるので、自作するのはfilterOfLineのunlines,filter,isInfixOf,linesの4つということになりますね。
0698デフォルトの名無しさん垢版2017/06/03(土) 16:19:39.76ID:59j26kfv
まずunlines

unlines [] = []
unlines (xs:xss) = xs ++ "\n" ++ unlines xss

ちなみに、++も自作出来ます。
(全ての中沖演算子はカッコで囲めば2引数の関数になります)

(++) xs [] = xs
(++) [] ys = ys
(++) (x:xs) ys = x:(++) xs ys
0699デフォルトの名無しさん垢版2017/06/03(土) 16:42:14.38ID:59j26kfv
次にfilter

filter _ [] = []
filter f (x:xs) | f x == True = x:filter f xs
filter f (x:xs) | f x == False = filter f xs
0700デフォルトの名無しさん垢版2017/06/03(土) 17:03:05.77ID:59j26kfv
isInfixOf

isInfixOf _ [] = False
isInfixOf xs ys | take (length xs) ys == xs = True
isInfixOf xs (y:ys) = isInfixOf xs ys

もちろんtake,lengthも自作可能。

take _ [] = []
take 0 _ = []
take n (x:xs) = x:take (n - 1) xs

length [] = 0
length (_:xs) = 1 + length xs

lengthはリストー>値なので末尾再起にしないとスタック消費するので、
末尾再起な補助関数使って作ったほうが良いですが。

length xs = length' 0 xs
......................where
.........................length' n [] = n
.........................length' n (_:ns) = length' (n + 1) ns
0701デフォルトの名無しさん垢版2017/06/03(土) 19:06:03.31ID:59j26kfv
最後にlines
変なところでハマってました・・・。

lines ns = lines' [] ns
...................where
......................lines' [] [] = []
......................lines' ys [] = ys:lines' [] []
......................lines' ys ('\n':xs) = ys:lines' [] xs
......................lines' ys (x:xs) = lines' (ys ++ [x]) xs
0702デフォルトの名無しさん垢版2017/06/03(土) 19:54:54.78ID:rGTJ2+S3
そういうのはブログでやっていただいて・・・
0706デフォルトの名無しさん垢版2017/06/04(日) 14:24:55.57ID:vTKCXAGF
>>697
ありがとございます
リストとパターンマッチのコンビは強力ですね

お礼がてら GNU Smalltalk でも書いてみました
普通に手続き的に書くとこんな感じです(インデントの全角スペースは適宜置き換えてください)

#!/path/to/gst -f
argv := Smalltalk arguments.
file := argv first.
word := argv second.

stream := FileStream open: file mode: FileStream read.
[stream atEnd] whileFalse: [
  | line |
  line := stream nextLine.
  (line indexOfSubCollection: word) > 0 ifTrue: [line displayNl]].
stream close

少しだけ関数型的なものを意識するとこんな感じになりますか

#!/path/to/gst -f
argv := Smalltalk arguments.
file := argv first.
word := argv second.

lines := file asFile contents lines.
filtered := lines select: [:str | (str indexOfSubCollection: word) > 0].
joined := String join: filtered separatedBy: Character nl asString.

joined displayNl
0707デフォルトの名無しさん垢版2017/06/10(土) 02:56:29.64ID:THjn34iS
>>706
結局メソッド頼りですね。。。
いあ、全てがオブジェクト故のメソッド依存ですね。
Cとかなら、むしろ長くはなりますがロジック部分の関数は自作出来ますもんね。

Haskellの例はよく車輪の再発明と馬鹿にされますが、車輪の再発明しやすいと言うことは、少ない知識で基本的な関数から応用的な関数まで作れると言うことだと思います。

>>697を複数ファイルで串刺し検索と行番号表示に対応させてみました。
(myfunc.hs + searchword.hs)
使用例:
>searchword numbering myfunc.hs number.hs

行番号表示機能のみのコードを以前作ってて、それを改良した形です。
(myfunc.hs + number.hs)

ファイルにmyfunc.hs + OOとなってる通り、共通だったり今後も関数として使いそうなものはライブラリとして括り出してみました。
0708デフォルトの名無しさん垢版2017/06/10(土) 02:58:17.25ID:THjn34iS
myfunc.hs

module Myfunc where

import Data.List
import Text.Printf

consNum::(Int,String) -> String
consNum (i,xs) = printf "%4d:%s" i xs

numbering = unlines.(map consNum).(zip [1..]).lines

searchWord w = unlines.(filter (isInfixOf w)).lines

putFileContent (f,cs) = printf "%s\n%s" f cs

number.hs

import System.Environment
import Myfunc

zipFileContent fs = return.(zip fs).map numbering

main = getArgs >>= \files -> mapM readFile files >>=
............zipFileContent files >>= mapM_ putFileContent
0709デフォルトの名無しさん垢版2017/06/10(土) 02:58:44.23ID:THjn34iS
searchword.hs

import System.Environment
import Myfunc

zipFileContent w fs = return.(zip fs).
...................................map ((searchWord w).numbering)

main = getArgs >>=
............\(word:files) -> mapM readFile files >>=
............zipFileContent word files >>= mapM_ putFileContent
0710デフォルトの名無しさん垢版2017/06/10(土) 22:48:53.27ID:puKcV3/9
>>707
> Cとかなら、むしろ長くはなりますがロジック部分の関数は自作出来ますもんね。

いや、メソッドでもロジックは記述できますよ→http://ideone.com/xiEftE
逆にできないと考える理屈がちょっとわかりかねます

> 少ない知識で基本的な関数から応用的な関数まで作れると言うこと

言語それ自体の学習には向いていますね
SmalltalkはライブラリはもちろんIDEを含む処理系それ自体もSmalltalkで組まれているので
普段自分が使っている機能がどのように実現されているかを調べる過程で学習ができます
GNU Smalltalkはそこらへんがちょっと弱いのが難点ですね

無用かとは思いましたが、通常の方法で記述したナンバリング+複数ファイル対応版も
#!/usr/bin/gst -f

(argv := Smalltalk arguments) isEmpty ifFalse: [
 word := argv first.
 files := argv allButFirst.

 files do: [:file |
  | count |
  file displayNl.
  stream := FileStream open: file mode: FileStream read.
  count := 0.
  [stream atEnd] whileFalse: [
   | line |
   count := count + 1.
   line := (count printPaddedWith: Character space to: 4), ':', stream nextLine.
   (line indexOfSubCollection: word) > 0 ifTrue: [line displayNl]].
  stream close]
]
0711デフォルトの名無しさん垢版2017/06/10(土) 23:22:11.89ID:Lo444BJb
>>710
ちゃうちゃう。
関数やメソッド抜きと言うか、知識がない場合でもって意味。
確かにsmalltalkの場合はガンガン調べられるのが強みですが。
うーん。。。調べる能力と作る能力の違いと言うのでしょうかね。。。
実際問題、smalltalk程の検索性は無いものの、haskellの関数もhoogleで大体ソース見れるんですが、今回敢えて見ませんでした。
(実はlinesだけ見たけど、逆に複雑過ぎて訳わかめでした)
実際のソースは効率とか可搬性も考慮されたソースですから、私ごときのソースと同じと言うことはないですが、表面上の動きだけは真似られます。
私の中では分岐さえ言語でサポートしてくれれば、ロジック部の自作はどんな言語でも可能で(チューリング同等)、haskellは分岐でifとかの余計な文字入れなくて済むのが楽だなぁとか、リストが基本だからアルゴリズムと相性良いなぁとかですかね。
配列だとリストが基本のアルゴリズムから、配列だったらどう実現する?って考えますから。
多分、最前線でプログラマしてる人はそう言うのを自然としてるんでしょうけど、私みたいなヘッポコは一旦haskellでワンクッション置くと普通の言語でもコード書ける様になりますね。
(少なくとも私は)
0712デフォルトの名無しさん垢版2017/06/11(日) 10:27:47.17ID:mVtMB5qw
>>711
> 分岐さえ言語でサポートしてくれれば、ロジック部の自作はどんな言語でも可能で(チューリング同等)

仰りたいことは分かるのですが、マシン語やラムダ式ましてチューリングマシンで何かを記述するのは
知的愉しみや学術・学習目的でならともかく、通常のプログラミングにおいては苦痛しかもたらしません
生産性を考えるなら、言語の機能や特性は
車輪の再発明のしやすさより、あるレベルまでのレイヤーの適切な抽象化に費やされるべきです

そういう切り口でメッセージングというパラダイムはいろいろなレベルの抽象化されたレイヤーに乗っけて
便利に使えるので私は気に入っています
0714デフォルトの名無しさん垢版2017/06/11(日) 14:03:25.44ID:QGjh7z3B
Person taro = new Person();
みたいな典型的な文法使ってくれる文には問題ないが、
関数内や引数のカッコ内で new したり、
コンストラクタ内でさらに new したり、
Person(new Car() ) みたいにコンストラクタの引数内でnewしてたり、
オブジェクト名のはずが array['taro'] みたいにクォートで囲まれて
'文字列' として連想配列のキーに指定されたりすると、
俺の中での「オブジェクト」のイメージが色々と崩壊する。
これどう解釈すりゃいいの?ってなる。
0717デフォルトの名無しさん垢版2017/06/11(日) 16:54:46.48ID:8HTADEw1
オブジェクト指向は「playと言ったら"再生"のことだろう」って
コードのわかりやすさ優先だけど
関数言語は「?って書いたらPRINTのことに決まってるだろ」って
『略語でタイプが減ってサイコー』厨が推進してる臭くて
どうにも胡乱(うろん:確かでなく、怪しいこと。うさんくさいこと)なものを感じる。
0718デフォルトの名無しさん垢版2017/06/11(日) 17:41:37.82ID:zRaXS3h8
感想文
0720デフォルトの名無しさん垢版2017/06/12(月) 08:23:44.68ID:SBdQG7Q8
>>712
それって結局ライブラリが揃っていて、探しやすければオブジェクト指向とか構造化プログラミングとか関数型とかのパラダイムはどうでも良いって言ってる様なものだなと。
そして、実際その通りなんですが、全てのプログラムのパターンを網羅するライブラリは事実上不可能です。
Delphiのコンポーネントでpascalインタプリタがあってポトペタで一行のコードも書かずにpascal処理系を作れたとしても。
結局どの言語もライブラリの関数なりクラスなりを組み合わせます。
smalltalkは検索しやすい方向へ進化し、Haskellは自作しやすい方向に進化したんじゃ無いかと。

そのsmalltalkコードは出力に依存してますが、私もRubyやPythonでよく書きます。
Haskellの場合は強制的に出力に依存しないコードになるので、number.hsのコードの最後の行を

mapM_ (putFileContent.(\(f, c) -> (f, searchWord word c)))

の様にputFileContentの受け取る値を横取りしてsearchwordコマンドを作っても良いです。
型さえ考慮すればnumbering以降から出力直前まで、好きな段階でsearchWord関数を使えます。

numberingとsearchWordそれぞれlines/unlines使ってるので汎用性高い代わりに無駄な処理も多いと言うなら、汎用性を犠牲にしてsearchWordにnumberingの中身を入れてしまえば良いです。

この様に特異な発想?にも柔軟に答えてくれます。
0721デフォルトの名無しさん垢版2017/06/12(月) 11:40:59.36ID:P8Snx3xG
>>720
> 全てのプログラムのパターンを網羅するライブラリは事実上不可能

ライブラリで、将来起きうるすべてのパターンを網羅しろというのは極論では?
学習目的でないなら車輪の再発明は避けるべきだし
よく使うパターンならライブラリ化(抽象化)されるべきだろうという主張に対し
件のご指摘は本末を転倒しています

> そのsmalltalkコードは出力に依存してます

「出力に依存する」ということの意味がわかりにくいのですが
抽出結果を各行逐次出力しているのが気にくわないのでしょうか?

それならそうでない処理の流れにすれば済む話で実際にも容易に書けます
>>706 の2番目や >>706http://ideone.com/xiEftEhttp://ideone.com/RUJP49
当初要求された仕様がどうなっていたか、何を重視するかといった方針の齟齬に過ぎないと思います

逆にたとえばご呈示のHsakellのコードで
メモリに一気には読み込めない巨大なファイルを扱わなければならないとしたら
今の枠組みのまま対応することはできないでしょう?それと同じ話です
0722デフォルトの名無しさん垢版2017/06/12(月) 12:20:40.28ID:OM2jEsCX

遅延評価なのでどんなに巨大なファイルを一気に読む様なコードに見えても、実際には表示するぶんずつしか読み込まれませんが。。。
0723デフォルトの名無しさん垢版2017/06/12(月) 13:05:25.72ID:6z3DqIFq
>>722
何の話かよくわからんが、遅延評価と遅延読み込みは違う。
遅延読み込みと非同期読み込みも違う。
何か勘違いしてないか?
0724デフォルトの名無しさん垢版2017/06/12(月) 13:43:22.37ID:OM2jEsCX
>>721
同じライブラリ化されるべきなら、より簡単にライブラリが作れた方が良いんじゃないか?と考えます。

また、ライブラリやクラスを使う際にはオブジェクト指向も関数型も差はないでしょうが、ライブラリを作る側だとクラスは使う時より楽じゃないと感じます。
0725デフォルトの名無しさん垢版2017/06/12(月) 13:58:04.43ID:OM2jEsCX
>>723
普通の言語のreadLine的なのが遅延読み込みですよね?
Haskellは表示しない値は無いのと同じ、表示して再度使う予定もないなら用済み。
(その証拠に、読み込んで複雑な処理させるけど表示しないコードは、何が書かれていようとそもそも何もしない。無限リストを表示させるとかも良い例)

一見全部読む混んで全部表示するコード書いても、表示に必要な分だけ読み込んで、表示が終わったら破棄されていきます。
普通の言語の遅延読み込みに相当するものも、遅延評価が勝手に似た様な働きをしてくれます。
違うのは、行毎とは限らない事くらいです。
0726デフォルトの名無しさん垢版2017/06/12(月) 14:54:51.94ID:P8Snx3xG
>>722
失念していました。であれば別の例を考えないといけないですね^^;

要は「部分読み込み→処理→出力」というスキームで進めなければならないシチュエーションでは
今のコードの枠組みは変えざるを得ないということが言いたかっただけです

ところでHaskellのreadFileというのは賢そいのですね
たとえば一番最後の行から逆順に出力するような場合
getArgs >>= \(file:_) -> readFile file >>= putStrLn . unlines . reverse . lines
でもファイル全体を読み込まずに済ませられる(つまり読み込むポジションのみ覚えていて適宜移動して読み込める)程度に賢いのですか?
0727デフォルトの名無しさん垢版2017/06/12(月) 16:50:34.40ID:uTHinYqc
>>726
そこは痛い所ですね。。。
賢くないはずです。
Haskell.orgも、その弱点を知ってるので良い加減克服されててもおかしくないですが。。。

少なくとも不思議の国のアリスやこころのテキストをwebからコピペして読ませてますが、reverseしないのと体感速度に差が無いですね。
(一文字ずつreverseさせれば流石に体感速度下がりましたが、行毎は感じませんでした)
今時はメモリもGBが当たり前なので余程じゃないと体感出来ないのかも。。。
まあ、すでに(ターミナル次第ですが)Python/Rubyより遅かったりしますけどね。。。
(全面ByteString使用する様に書き換えれば同程度には高速化するでしょうが)

書き捨てコード同士では負けますが、ライブラリ化したらPython/Rubyの書き捨てコードより短くなります。
0728デフォルトの名無しさん垢版2017/06/12(月) 20:22:55.90ID:Y8yY2E9Z
Haskellでさ、ファイルを読み込んでアルファベット小文字を大文字に置き換えて
読み込んだファイルに上書きできる?
0729デフォルトの名無しさん垢版2017/06/13(火) 09:56:27.83ID:OES2L0YQ
Haskellに限らず楽勝ですね。
0731デフォルトの名無しさん垢版2017/06/13(火) 20:11:42.46ID:xFYZZfX+
>>730
いやあ、同名のファイルに直で保存しようとするとロックされるの失念してた。
そう言えばtempファイルがどうとかどっかで読んだなぁとかRWH読んでたけど見つけられなくて、
でも一旦別名で書き込めばtempファイルにこだわる必要無いじゃんって事で元のファイル名の頭にoutって付けて一旦保存して、
それを開き、内容をそのまま元のファイルに書き込んだった。

これこそ発想の転換w
0732デフォルトの名無しさん垢版2017/06/13(火) 20:26:50.47ID:fqt/gc/S
そんな簡単なコードも書けない言語で
まともなシステムなんて書けないと思わない?
0733デフォルトの名無しさん垢版2017/06/13(火) 20:31:40.86ID:MoJEidw0
ん?
書けたけど?
正攻法じゃなかったのはおいらの知識不足が問題であって、言語の問題じゃ無いよ?
それに発想の転換と言うか、知恵と工夫で解決するのは、どんな言語使ってても必要な事。
だからっておいらがプログラマに向いてるわけじゃ無いのは理解してるが。
0734デフォルトの名無しさん垢版2017/06/13(火) 20:31:48.79ID:6y8LhsYq
>>731
ちょっとググればやり方わかるのにそれすら調べもせずに幼稚で姑息な思いつきをしたり顔で「発想の転換」とか草
結局、readFileのブラックボックス化をよしとしてるからそういうことになるじゃないの
自慢の車輪の再発明のしやすさとやらは何処へ?
0735デフォルトの名無しさん垢版2017/06/13(火) 21:33:59.97ID:IUJZXol8
少ない知識で作りたいものを作れるってのが利点だと思ってるからね。
車輪の再発明しやすいのも、その一環。
その宣伝のためにも敢えてあまりググらない。
ググって見つからないぐらいで作りたいものを作れなくなる様な言語じゃ困る。
0736デフォルトの名無しさん垢版2017/06/13(火) 21:38:43.06ID:+kV5cJp9
いやググれよHaskellerが馬鹿だと思われる
0737デフォルトの名無しさん垢版2017/06/13(火) 22:21:04.68ID:6mJhj0/B
そゆのは他の優秀なHaskellerに任せる。
おいらは実際頭悪いし。
0739デフォルトの名無しさん垢版2017/06/13(火) 22:28:26.94ID:+kV5cJp9
カプセルすべきものがないからな
0742デフォルトの名無しさん垢版2017/06/13(火) 22:32:14.23ID:9he6m/gR
本質的には何も必要ないよ?
オブジェクト指向をやりやすくするための
言語仕様を備えてるだけなんだから
0746デフォルトの名無しさん垢版2017/06/14(水) 01:43:10.82ID:CkeSeNJV
Haskellはモジュール単位で隠蔽機能がある。
モジュール公開側も公開したいものだけ指定出来るし、importする側も、さらに細かくこの関数だけ読み込むとか、この関数以外を読み込むとか、細かく指定出来る。
0747デフォルトの名無しさん垢版2017/06/14(水) 01:47:53.66ID:CkeSeNJV
>>743
オブジェクト指向もメソッドチェーンで宣言的プログラミングを目指したけど、何年経っても手続き的な側面を脱却出来ない時点で失敗作。
一緒にすんな。
0748デフォルトの名無しさん垢版2017/06/14(水) 07:43:27.89ID:FHXnlM5+
Haskellもモナドで手続きも書けるようにしたけど
モナドで手続き書くとマジ終わってるレベルで読みにくくて冗長
かと言ってHaskellでも性能出そうと思うと手続きを書かざるを得ない
つまりウンコ言語
0753デフォルトの名無しさん垢版2017/06/14(水) 08:45:08.83ID:JrGv0x1p
>>750
カプセル化が必要だとするならそれは設計が間違っているというのがhaskellの議論で明らかになったわけです
0754デフォルトの名無しさん垢版2017/06/14(水) 09:03:03.20ID:JrGv0x1p
>>747
手続き型つまり構造化プログラミング
オブジェクト指向は構造化プログラミングの
延長線上にあるものだから手続き型は友達です
仲良くしましょう
0755デフォルトの名無しさん垢版2017/06/14(水) 09:08:24.09ID:JrGv0x1p
純粋関数型と呼ばれるどこぞの言語にもdoがあるでしょう
つまり手続き型は数学的モデルのあるちゃんとした方法なんです
それを駄目だと思うのは慣れすぎてマンネリ化してるからなんです
0756デフォルトの名無しさん垢版2017/06/14(水) 09:10:44.44ID:OTRTw69H
原点に帰ろう
c言語からやり直そう
linuxはc言語で書かれていますが
完全にオブジェクト指向です
0757デフォルトの名無しさん垢版2017/06/14(水) 09:42:08.75ID:Zur2LRZk
>>753
前どこかのスレにコマンド引数の偶数番目と奇数番目を分けてリストに入れて、後から1、2番目を一つの組み。3、4番目を2つ目の組み。。。
みたいにして表示するコードをHaskellとPythonとRubyで書いたが、皮肉にもグローバル変数があっても良いはずのHaskellだけがグローバル変数作らないで済んで、
PythonとRubyはグローバル変数作らないとダメだった。

Pythonは書き様によってはグローバル変数無くせそうだったし、Rubyのsliceヒントに別の書き方のが全言語でグローバル変数要らなくなったし、シンプルになったけど。
0758デフォルトの名無しさん垢版2017/06/14(水) 09:46:27.58ID:Zur2LRZk
>>755
doの書き方は手続き型言語でも宣言的と呼ばれる関数(メソッド)呼び出しの羅列の再現。
ループとかの手続き丸出しなのの再現はあくまで再帰。
だが再現はループの代わりにもなるが、あくまで値を返す関数。
メソッドチェーンと同じで返ってくる値の型を意識する。
0759デフォルトの名無しさん垢版2017/06/14(水) 09:47:28.86ID:Zur2LRZk
x再現はループの
o再帰はループの
0761デフォルトの名無しさん垢版2017/06/14(水) 10:50:09.06ID:DZ9ij0Gz
>>757
> PythonとRubyはグローバル変数作らないとダメだった。

これ↓のどこでグローバル変数を作る必要があると?

print(list(zip(*[iter(sys.argv[1:])]*2)))

p ARGV[0...ARGV.size/2*2].each_slice(2).to_a
0762デフォルトの名無しさん垢版2017/06/14(水) 11:07:50.39ID:Zur2LRZk
>>761
お、そう書けるのね。
おいらPythonやRubyは(Haskellもそこまでじゃないけど)初心者程度だから。

そもそも重要なのは手続き型言語はグローバル変数がバグの温床になるのに、Python、Rubyじゃいとも簡単に作れちゃうって事ね。

Haskellみたいなグローバル変数がバグの温床になるわけじゃない言語でさえもパッケージ単位でカプセル化考慮されてるのに、初心者程グローバル変数宣言しちゃうし、出来ちゃうのは問題だよ。
0763デフォルトの名無しさん垢版2017/06/14(水) 11:15:17.26ID:Zur2LRZk
>>761
って、よく見たらsliceの方のアルゴリズムだし。。。
上でも、そっちはグローバル変数使わなかったって書いてるだろ。
コマンド引数の配列なりリストなりを

args!!i -- Haskell の場合
args[i] #Ruby、Pythonの場合

このインデックスのiを奇数か偶数か判定して、それぞれのリスト(配列)を作ってzipするアルゴリズムではグローバル変数使った。
おいらの力量のせいだったのかもしれんが、そう言う書き方に自然となったのが問題って話。
0767デフォルトの名無しさん垢版2017/06/14(水) 12:49:59.35ID:DZ9ij0Gz
>>763
ふつうに書けばシンプルに書けるものをなんでわざわざ複雑にせなあかんのかがわからん

p ARGV[0...ARGV.size/2*2].select.with_index{ |_,i| i.even? }.zip(ARGV.select.with_index{ |_,i| i.odd? })
0768デフォルトの名無しさん垢版2017/06/14(水) 12:51:07.02ID:pq4tRhVl
めっちゃ複雑やんw
0769デフォルトの名無しさん垢版2017/06/14(水) 12:53:55.83ID:u4jybkYs
(function(){
処理
})();

JavaScript でも、グローバルスコープにしないため、ファイル全体を無名関数で囲む。
Rubyでも、囲めばよい

結局、囲むという事は、クラスと同じ。
関数・クロージャ・ブロック・ラムダ式など、どういう表現をしようが、
スコープがあるという事は、クラスと同じ
0770デフォルトの名無しさん垢版2017/06/14(水) 12:55:47.63ID:Zur2LRZk
>>764
その発想は無かった。

>>766
実はHaskellも最初リスト内包表記でグローバル変数作ってたんだけどね。
結局判定する関数のevenとoddしか違いが無かったからmakeList関数作って纏めただけなんだが、同じリスト内包表記あるPythonで同じ様にしようとしたらi % 2 == 0とか書かないといけなかったのね。
んで、まあ良いや。0か1かで奇数偶数分けられるから関数作っちゃえって思ったらエラー出た。
定数じゃないとダメっぽくて諦めたけど、リスト内包表記に拘らなければ関数に出来たと思う。
(もしくは将来的にリスト内包表記のif式に外部から変数渡せる様になったら作れる)

処理全体を関数にしちゃうってのは確かにグローバル変数を無くす有効な手段だが、初心者ほどそんな事しない。
0771デフォルトの名無しさん垢版2017/06/14(水) 12:59:16.57ID:Zur2LRZk
>>767
ファイル名とファイルの内容をzipするコード書いた後の実験的なコードだったんで、そう言う発想になった。
後でsliceなコードのが単純だし、グローバル変数使わないって気付いたけど。

ここではどうしても使わざるを得ない場面が出て来たってのを言いたかっただけ。
0776デフォルトの名無しさん垢版2017/06/14(水) 21:53:40.74ID:293Y7UBw
>>771
>ここではどうしても使わざるを得ない場面が出て来たってのを言いたかっただけ。

それが間違いなんだって言ってんだろ
どうしようもないアホだな
0777デフォルトの名無しさん垢版2017/06/14(水) 22:01:32.77ID:293Y7UBw
そもそも771は長くても10行程度のコードしか書けないクソ初心者だろ?
その規模じゃグローバル変数でも問題ないわ
0780デフォルトの名無しさん垢版2017/06/15(木) 01:53:46.41ID:K1DnwnKl
継承、実装、DIの違いをポケモンを例に説明してくれ。
0782デフォルトの名無しさん垢版2017/06/15(木) 08:21:04.78ID:YgSQzG1P
>>776
間違いというか効率悪い方の例をわざわざあげてる意味わかってる?
この例に限らず、グローバル変数がバグの温床になるって分かってるのに、
どうしてもグローバル変数使わないと書けない場面があるから黙認されてるっていうのが、
もうオブジェクト指向はグローバル変数に対して根本的な解決策を持たない不完全なパラダイムだって証左だよ。
0783デフォルトの名無しさん垢版2017/06/15(木) 09:25:01.12ID:ESWCwDfu
>>782
Haskellだってどーしよーもないコード書くやついくらでもいるわ
お前はそのどーしよーもないコードの書き方すら知らない存外の低脳ってだけの話
0784デフォルトの名無しさん垢版2017/06/16(金) 12:29:20.85ID:HP1Jz4Vg
プログラムを勉強して日が浅いのですが、LSPを意識すると継承って何の意味があるんだろうと思ってしまいます

置換可能を実現できるということは、サブクラスはスーパークラスそのものってことになるような気がして

LSPの概念は、どう便利なのでしょうか
0785デフォルトの名無しさん垢版2017/06/16(金) 13:56:31.30ID:zL8gur9S
グローバル変数が無いと書けない場面なんて無い
グローバルスコープのシングルトンオブジェクトでいい
必要ならね
0786デフォルトの名無しさん垢版2017/06/16(金) 14:28:02.28ID:pc3mXeVr
>>784
>サブクラスがスーパークラスそのもの

受けとる側の視点ではそれでいいんだよ

違いを意識する/したいのは渡す側
0787デフォルトの名無しさん垢版2017/06/16(金) 19:13:51.77ID:HP1Jz4Vg
>>786
なるほど、なんとなく解った気がします

あとは、どういうシュチュエーションで便利かモデリングの数をこなして覚えたいと思います
0788デフォルトの名無しさん垢版2017/06/16(金) 20:00:04.73ID:Z2HbLI7g
>>787
まあ、低次元なことを言うと、
「いろいろサブクラスを作ったけど、受ける側の関数は全く変更せずに済んだ!わーい!」
てのがメリットの一例。
0790デフォルトの名無しさん垢版2017/06/17(土) 02:54:17.87ID:1edbV8Vs
メソッドディスパッチの問題だろ?

というBlogをみて「ああそれだよそれ、そういうのでいいんだよ」(孤独のグルメ風表現)になった
0791デフォルトの名無しさん垢版2017/06/17(土) 11:41:41.30ID:m1x703gI
第1目標:修正が他までどんどん波及していって修正地獄にならないようにする

なのに、変な原理原則マンに限ってそこがスッポリ抜けてたりするからな
0792デフォルトの名無しさん垢版2017/06/17(土) 14:11:25.74ID:qMkdrUOQ
原理原則っつーか原理主義者っつーか
そもそもOOは原理といえるほど理屈がしっかりしてないだろ
複数のオブジェクトにまたがるメソッドをどこに実装しようかっていう初歩のレベルで
すっきりしないというのに
むろんマルチメソッドという考え方もあるけど、ほとんどのOOPには実装されてないしな

だから複数の色んなことを同時に考慮して、うまい具合にしなきゃならないっつーのに
原理原則とかでは無いわ

我々は空間と時間を両方扱っているわけで、片方だけに着目すりゃよいってものでもないわ
0793デフォルトの名無しさん垢版2017/06/17(土) 14:15:26.57ID:qMkdrUOQ
第一、OO程度の原理原則に思考回路が縛られるって
潜在的に、そうとうオツムが弱いよな
世の中の理屈とかけ離れすぎているというか、単純化しすぎ
0794デフォルトの名無しさん垢版2017/06/17(土) 15:24:12.75ID:hpXZLyYV
>>792
> 複数のオブジェクトにまたがるメソッドをどこに実装しようかっていう初歩のレベルで

オブジェクト指向は、現実世界で実現しているオブジェクトに
ソフトウェアの設計を合わせようとするものだが、

現実世界のオブジェクトでは、
「複数のオブジェクトにまたがるメソッド」は
どこに実装されているんですか?


複数のオブジェクトにまたがるメソッドというものが
そもそも不自然なメソッドですよね?
0795デフォルトの名無しさん垢版2017/06/17(土) 16:14:00.96ID:jlRZsUTe
>>794
>現実世界のオブジェクトでは、
>「複数のオブジェクトにまたがるメソッド」は
>どこに実装されているんですか?

物理法則に実装されてる
0797デフォルトの名無しさん垢版2017/06/17(土) 17:27:39.37ID:qMkdrUOQ
はい皆さん>>794を読んでください
もうこの時点でアホっぽいってわかるでしょ
ありえないぐらいで、釣りじゃないかと疑うぐらい

アホらしいけどまず基本的なことからいうと
コンピュータは日本語で「計算機」ともいうのでそっちの方向から攻めると
足し算は現実世界のどこに実装されているんですか?っていうぐらいアホなイチャモン

物や物体的なことにこだわって、概念的なことであるとか関係性といったものを
認めない姿勢は技術者ではない以前に、人間的ですらない
0798デフォルトの名無しさん垢版2017/06/17(土) 17:38:01.77ID:hpXZLyYV
>>795
物理法則っていうのは、

例えばすべての物体は引力があるとか?
あ、これ複数のオブジェクトにまたがるんじゃなくて
個々のオブジェクトに引力があるのか

例えば、熱を加えると発火するとか?
あ、これもその物体が変化するだけか

複数のオブジェクトにまたがるメソッドってなんですかね?
0799デフォルトの名無しさん垢版2017/06/17(土) 17:40:22.96ID:hpXZLyYV
>>797
数値を入力してボタンを押すと足し算を行うのは
計算機というオブジェクトが持ってる機能ですよね?
それとも電気信号レベルの話をすれば良いのですか?

そろばんでも足し算ができますが、
もしかしてこの2つを同一のものとみなしてるのですか?
そろばんは電気信号じゃなくて物体の位置で表現するって
だけですからね。
0800デフォルトの名無しさん垢版2017/06/17(土) 18:01:41.38ID:qMkdrUOQ
アホか
数学上での足し算という「概念」の話だ
1に2を足すと3になるっていう概念上の関係性の話だ
別に現実世界に実装があるわけじゃないが、1に2を足すと3になるし、有用なんだよ
ついでに言うと、1とか2とかいう数字自体からして現実世界に実装が存在しているわけではない
1とか2はあくまで数学上の概念だ
もう本当にあほだなぁと思う、あきれて言葉も出ない
こうなったらもうエンジニアとして終わりなんだと思うし
人としても鬱病になる末路なんだろうか、知ったこっちゃないが
0801デフォルトの名無しさん垢版2017/06/17(土) 18:08:50.48ID:qMkdrUOQ
>数値を入力してボタンを押すと足し算を行うのは
>計算機というオブジェクトが持ってる機能ですよね?
>それとも電気信号レベルの話をすれば良いのですか?

この発言もかなり面白くて、この言葉通りにプログラムをすれば
すべてのメソッドはコンピュータインスタンスに紐づくことになる
computer.add(1,2); computer.func(a,b,c);ってところか?
OOだなんだいったって、実際に処理をするのは「コンピュータ」
に他ならないんだから至極当然な意見だわなwww
たしかに現実世界を模してるわ
いわゆるGODクラス、staticおじさんと同じだ
つまりもう、自分がどういう立場をとっていて何を言っているのかすら
よくわかっていない状態ということだな
病的
0802デフォルトの名無しさん垢版2017/06/17(土) 18:17:41.65ID:hpXZLyYV
>>800
> 1に2を足すと3になるっていう概念上の関係性の話だ

1という値の数値オブジェクトに
2という数値オブジェクトを引数に
数値オブジェクトの加算メソッドを呼び出すと
3という数値オブジェクトになるって話?
0804デフォルトの名無しさん垢版2017/06/17(土) 19:48:30.88ID:hpXZLyYV
>>803
そりゃそうでしょw

地球の引力を計算するには、月の存在が必要だ!
などといったら笑われるよw
0805デフォルトの名無しさん垢版2017/06/17(土) 20:34:57.52ID:qMkdrUOQ
ほらまたバカなこと言いだしたでしょ、すごいでしょ、この病気
俺がかなり煽った文体で書きこんでるのにもかかわらず
お前の援軍は誰も現れないでしょ、これが現実
頭悪すぎて他人の言っていることも自分の言っていることすら理解できないという
もうどうしようもない残念さで、誰も味方がいない

この手の人は本当にもうどうしようもなくて
かわいそうだからと周りの人が説得を試みても全くの無駄というか
普通の人が当たり前にできる思考が、どうにも理解できないらしく
必ず自分にわかる範囲で自分の領域に持ち込んで考えようとするんだが
その行為自体が間違っているってことが何故か分からないらしい
袋小路でとにかく打つ手なし
0807デフォルトの名無しさん垢版2017/06/17(土) 20:44:48.25ID:qMkdrUOQ
まず引力に関して言えば、引力という力の存在は認められているが
なぜ引力という力が働くのかということは
本当のところは誰にもわからない
つまりは表面上そう見えるからそういう力があるのだろうという程度のものであり
根本的な原理は未解明なので、誰が引力を実行しているかとか考えるだけバカ

あと本質的に>>803が言いたいのは、オブジェクトが一つしかなければ
引力など定義しても無意味だし、引力の効能は性質となって表れないから
定義もされないっていう意味だろう
まぁ一般的な考え方だな
世の中は極めて相対的だしな
お金の価値ですらそうだしな
0808デフォルトの名無しさん垢版2017/06/17(土) 20:46:44.94ID:hpXZLyYV
> オブジェクトが一つしかなければ
> 引力など定義しても無意味だし、

オブジェクトが一つしかない状態に限っていえば
無意味なんだと言われましても・・・

数字だって一つしかなければ
足し算は無意味ですよ?
0809デフォルトの名無しさん垢版2017/06/17(土) 20:48:06.62ID:hpXZLyYV
あ、そうか
マルチメソッドはオブジェクトが一つしかなければ無意味だ!
って言いたいんだな。
0810デフォルトの名無しさん垢版2017/06/17(土) 21:15:05.61ID:qMkdrUOQ
わかりやすいところでWeb検索の例だと
Googleのページランクの仕組みは非常に現代的だったわな
たくさんあちこちからリンクが張られているページは有用性が高いのだろう
そして有用性の高いページからリンクが張られているページもまた有用性が
高いのだろうっていう
そんで、かつてのYAHOO方式は負けたわけだ
でも別に珍しいことではなくて、論文とかでもたくさん引用されている論文は
価値が高いってことになってるし、まぁ基本といいますか
たくさん友達のいる人は有能なんだろうってのも大体あってるし
取引先の多い企業、特に大企業との取引がある会社は信用が有るってのも
一般的な価値基準だわなぁ
資本主義に関しても、お金のような流動性のあるものに着目するっていうのが
現代的であるし、お金をどんどん回して経済を発展させようってのも
政治家の大好きな謳い文句だわな
大体世の中そういう構図になっているから、反対へ行く人や軽んじる人
もしくは君みたいに理解できない人は北朝鮮になる
ただ何事もバランスは大事なんだけど、そうはいってもどっちに軸足を置いておくか
ってのはあるわな
簡単な方の考え方は誰にでもできるし、意識する必要もないし、学ぶべき部分もないから
あまり重要視されないんだけど、本音と建て前みたいな話にもなってくるわ
ただ、とっちが建前になってどっちが本音になるかは相手とシチュエーションによるという
つまり俺もOOPを、「使う」わけだが、いつも「必要悪」という考えはある
絶えず反対のことを考えながら吟味してOOする
そのぐらいでちょうど良いバランス
ただ、本音と建前の世界なのでコンセンサスが取りにくい
hpXZLyYVみたいなのが入ってくると破たんする
いちいち面倒くさいんでLinusがC++を追い出す気持ちもわかる
OOPをおもちゃにする奴はマジで糞
0811デフォルトの名無しさん垢版2017/06/17(土) 21:26:18.74ID:qMkdrUOQ
あと、物理量としての引力、っつーか質量と、相互作用としての引力の働き
では差があるわな
しかも現実世界の引力のメカニズムは解明されていない
どういう理屈で力が働くのかとか、だれにも分からん

>例えばすべての物体は引力があるとか?
>あ、これ複数のオブジェクトにまたがるんじゃなくて
>個々のオブジェクトに引力があるのか

「個々のオブジェクトに引力がある」って何ですか?
すべての人には年齢がある、と同じノリですか?
0812デフォルトの名無しさん垢版2017/06/17(土) 21:59:39.35ID:qMkdrUOQ
>>343
あぁごめんな
ただあの人のインタビューとか読めばわかるけど
逆張り逆張り言ってる
あの人自身もRubyの筋が良いとかメインストリーム的な思想であるとは
考えてないんだよ
ただ、自分の人生の中で逆張りした場合にうまくいくことが多かったので
逆張りし続けているんだとか
だからRuby3.0でも逆張りの一種として
静的型の機能は導入しない方向を検討しているんだろうな
ただそう何度も逆張りが上手くいくとは思わないし
逆張りはしょせん逆張りだろ?あだ花というかなんというか
そういうこともあって結局Rubyはプチブームで終わった現状があるわけだし
変なことして注目を集めることはあってもそれは一過性だよ、芸人じゃあるまいし
しかも逆張りしたときに自分にとって都合がよいことが多かったってだけで
使い手のことは別に考慮されてないんだよなー
0813すまそ垢版2017/06/17(土) 22:00:28.43ID:qMkdrUOQ
いわゆるこれは誤爆だな
0814デフォルトの名無しさん垢版2017/06/17(土) 22:12:00.21ID:8ikdtkeK
シングルディスパッチ擁護勢ってwikipediaの多重ディスパッチのページのJavaの例を許容してるんだろうか?
0815デフォルトの名無しさん垢版2017/06/17(土) 22:54:41.66ID:ExP73Jcy
モノにこれこれの機能がある、なんていうモデリングは現実世界には適用しづらいのではないか
いわんや物理法則をや
0816デフォルトの名無しさん垢版2017/06/18(日) 00:10:58.25ID:Sub4PpSI
物理法則は存在させるなら基底クラスかシステムに仕込んで全てのオブジェクトが従うもんでしょう。
個別のふるまいレベルで弄るもんじゃないから、そもそも例えですら出てくるようなもんじゃない。
0819デフォルトの名無しさん垢版2017/06/18(日) 01:35:23.79ID:LYWH9ARf
オブジェクト志向が現実のものをそのままモデル化するためにあるなんて大嘘誰が言い始めたんだ
0820デフォルトの名無しさん垢版2017/06/18(日) 01:42:11.38ID:dLIsPmeH
× オブジェクト志向が現実のものをそのままモデル化するためにある
○ 人間が自然に認識している現実のもの(オブジェクト)を使って
モデル化するから理解しやすいものが出来上がる。
0821デフォルトの名無しさん垢版2017/06/18(日) 01:48:39.71ID:LYWH9ARf
オブジェクト指向は、現実世界で実現しているオブジェクトにソフトウェアの設計を合わせようとするものなんていう大嘘誰が言い始めたんだ
0822デフォルトの名無しさん垢版2017/06/18(日) 02:09:35.32ID:Sub4PpSI
「せんし」に「たたかえ」送るとプレイヤーは細かいこと指示しなくても自分で戦ってくれる。
これはあくまでモデル上でのすっきりした切り分けの話であって、こういうオブジェクト化に
「戦場で仲間に"たたかえ"ってなんだよw」とか「順番に交互に殴るのかよ」とか言ってもまったく無意味だというのに
キャットドアじじいはなんかそういうことから理解できてない知恵遅れだからね。
0823デフォルトの名無しさん垢版2017/06/18(日) 02:54:24.42ID:dLIsPmeH
オブジェクト指向の話をしていると
よく勘違いしてるやつが出てくる。


オブジェクト指向で現実世界を実現しようとするやつだ。
シミュレーションでもやらない限りそんなものは意味がない。


その逆、実現したいものを現実世界をヒントに
オブジェクト指向でモデル化するんだよ。

そうすることで現実世界という共通認識を利用して
実現したいものをわかりやすく表現することができる。
0826デフォルトの名無しさん垢版2017/06/18(日) 06:57:50.55ID:ECvs/sM3
ドア本体とそれに付属するノブの状態(「開閉」と「回す、離す」)、
ノブに付属するラッチ(固定具)の状態(ノブの回転に応じて引っ込む)
をオブジェクト指向でモデリングしてみてよ

オートクローザーやドアストッパーが設置されることも加味しつつ
0827デフォルトの名無しさん垢版2017/06/18(日) 07:37:54.80ID:ZkAshefq
「たたかえ」送ってないのに勝手に雑な戦いを始めたがる「ばか」たち
0829デフォルトの名無しさん垢版2017/06/18(日) 07:53:36.83ID:/PaBW9c2
現実世界とか言い出すといくらでも後出し要件が出てくる。
「でも現実を見てみなよ」って。
モデリング終わりがなくなってしまうわけだ。
そういうバカには5000兆円の見積書でも送りつけてやればいい。
0830デフォルトの名無しさん垢版2017/06/18(日) 08:07:11.57ID:pnvlJ80w
物事を分類整理するための手法なのだから管理する要件でない不用な要素は極力排除しないとな
0831デフォルトの名無しさん垢版2017/06/18(日) 09:07:26.63ID:GpgbwXNc
相互作用という物理では当たり前の考え方を
理解できない文系のためのモデリング
それがオブジェクト指向
0832デフォルトの名無しさん垢版2017/06/18(日) 11:56:10.30ID:dLIsPmeH
>>824
例えば>>826のようの

現実世界にある何か(ドア)をオブジェクト指向で表現してくれ
なんていう考え方がアホなんだよ。

ソフトウェアでドアを作ることがあるとしたら、
ゲームとかだろうけど、ゲームとして必要なドアを
ソフトウェアで実現するならば、オブジェクト指向が便利ですね

なぜなら、ゲーム世界のドアをオブジェクトとして実装することができるので
現実世界で我々がよく知ってるドアを参考にできるからです。

ってな具合
0833デフォルトの名無しさん垢版2017/06/18(日) 13:56:58.20ID:/PaBW9c2
文系って言い方はあれだけど、物理法則を因果関係的に捉えてるのかもな。
あれがこうしたらこれがこうなる、みたいに。
0834デフォルトの名無しさん垢版2017/06/18(日) 14:23:38.73ID:ZkAshefq
理系って言い方はあれだけど、物理法則を因果何的に捉えてるの?
0835理系垢版2017/06/18(日) 14:27:11.50ID:GE9zkfwM
>>834
因果応報。
0836デフォルトの名無しさん垢版2017/06/18(日) 14:30:00.44ID:dLIsPmeH
人間って何歳の頃から、現実世界を
オブジェクト指向として認識するのだろうか?

同じ人間であっても自分の母親と他人の母親は別だって
理解できるし、人間と動物の区別もついているだろう。
そして、犬はワンワン、猫はニャーニャーって鳴くことを
理解するだろう。

人間の認識とはかくもオブジェクト指向であるものだろうか
0838デフォルトの名無しさん垢版2017/06/18(日) 19:18:13.12ID:M+qF4ayC
>>832
ゲームのドアなんぞ開く閉じるの状態と、開く条件(鍵とか)ぐらいだろ。

んで、自動ドア制御とかだとセンサーから信号が来た時だけ開いて、数秒したら閉じれば良い。
人が通った時の赤外線センサーか、人が挟まった時の圧力センサーかはプログラムは知る必要無い。

これらに共通のドアクラスなんぞ作って何か共通点があるの?
0839デフォルトの名無しさん垢版2017/06/18(日) 19:24:10.12ID:ZkAshefq
>>838
開く閉じるの状態があるのは開口部のほうやけんど?
0841デフォルトの名無しさん垢版2017/06/18(日) 21:51:50.67ID:dLIsPmeH
>>839
それは現実世界のドアの話だろう?

ゲームの世界のドアは、現実世界を参考にできるが
ゲーム特有のドアという仕様を作る。

3Dゲームであれば、ドアには開く閉じるという状態は必要ないだろう
なぜなら物体をすり抜けられないという仕様と
蝶番を支点にドアを動かせるという仕様があればよいからだ

だけど2D RPGみたいなドアであれば、ドアの状態というものがあってもよい
開いているドアであれば、その上を移動することができ、
取っじているドアであれば、その上に移動することはできない。

このようにオブジェクト指向は現実世界の物シミュレートためのものじゃなくて
作りたい仕様を、みんなが持っている現実世界の共通認識を使って
わかりやすくする表現するための技術なんだよ

それにしても現実世界のドアについての人間の認識ってのも面白いよな。
ドアからすれば、物理的にはどういう位置にあるかでしかないのに、
人間は「開いている」「閉まっている」というドアの状態として認識しているわけだ
この認識、利用しない手はない!
0842デフォルトの名無しさん垢版2017/06/18(日) 21:54:52.64ID:ZkAshefq
>>841
開口部の状態だって教わったのに意地はっちゃってw
ドアオブジェクトなんてそもそも必要ないんや
こーゆーのをモデリングゆーんやわかったかボケカス
0844デフォルトの名無しさん垢版2017/06/18(日) 22:01:44.39ID:dLIsPmeH
アスペだと「ドアが開いている」ときいて

ドアが開いているとか意味がわからない
開口部があってそこがドアというもので塞がれているかどうかだ。
だから「開口部がドアで塞がれていない」と言うべきだ

とか思うのだろうか?

アスペには常人の共通認識は通用しない
オブジェクト指向には不向きな人間だなw
0845デフォルトの名無しさん垢版2017/06/18(日) 22:09:09.19ID:ZkAshefq
>>844
なあ?お前の考えた最強の抽象化ってぜんぜん抽象化じゃなかっただろ?
恥ずかしいけどこれで一つ賢くなったんだ
次はもう少し長くドヤれるようになるじゃないかw
0846デフォルトの名無しさん垢版2017/06/18(日) 22:11:24.68ID:dLIsPmeH
>>845
誰が最強の抽象化とか言ったんだ?
お前はだれと戦ってるんだ?

俺の言ってることに何一つ反論して無くて
俺のほうが正しかったと主張してるだけ
妄想も大概にしろよ。
0847デフォルトの名無しさん垢版2017/06/18(日) 22:14:21.01ID:ZkAshefq
>>846
え?お前なんか意味のある事言ってたの?
じゃあもう一度言ってみ?聞いてやるからw
0848デフォルトの名無しさん垢版2017/06/18(日) 22:15:23.98ID:dLIsPmeH
抽象化というのは本質的な所

ドアには開いている・閉じているという
状態があると認識することだよ。


本当は開口部だーとか細かいことに
こだわるのは抽象化とは逆の考え


はい論破♪
0849デフォルトの名無しさん垢版2017/06/18(日) 22:15:46.63ID:dLIsPmeH
>>847
もう一度言えばいいの?

それは現実世界のドアの話だろう?

ゲームの世界のドアは、現実世界を参考にできるが
ゲーム特有のドアという仕様を作る。

3Dゲームであれば、ドアには開く閉じるという状態は必要ないだろう
なぜなら物体をすり抜けられないという仕様と
蝶番を支点にドアを動かせるという仕様があればよいからだ

だけど2D RPGみたいなドアであれば、ドアの状態というものがあってもよい
開いているドアであれば、その上を移動することができ、
取っじているドアであれば、その上に移動することはできない。

このようにオブジェクト指向は現実世界の物シミュレートためのものじゃなくて
作りたい仕様を、みんなが持っている現実世界の共通認識を使って
わかりやすくする表現するための技術なんだよ

それにしても現実世界のドアについての人間の認識ってのも面白いよな。
ドアからすれば、物理的にはどういう位置にあるかでしかないのに、
人間は「開いている」「閉まっている」というドアの状態として認識しているわけだ
この認識、利用しない手はない!
0850デフォルトの名無しさん垢版2017/06/18(日) 22:18:27.67ID:dLIsPmeH
ドアが開いている、閉じているという話をする時
開口部なんて細かい枝葉は誰も考えてないって所が重要だね。

まあ密室殺人で警察に聞かれた時に
この部屋の開口部はドアで塞がれていましたなんて
言わないのと同じこと。
0851デフォルトの名無しさん垢版2017/06/18(日) 22:22:00.29ID:ZkAshefq
>>848
ドアって開口部を制御するための具体的実装の一例にすぎんのだかw
抽象とは真逆の概念ですよ?オブジェクトハカセw
0852デフォルトの名無しさん垢版2017/06/18(日) 22:28:26.80ID:dLIsPmeH
>>851
だから、お前、オブジェクト指向を現実世界をシミュレートするために使うなって
それが間違ったオブジェクト指向の解釈なんだよ。

ドアを抽象化して考えろ。細かい枝葉は取り除け

抽象化
https://ja.wikipedia.org/wiki/%E6%8A%BD%E8%B1%A1%E5%8C%96
> 抽象化(ちゅうしょうか、英: Abstraction、独: Abstraktion)とは、
> 思考における手法のひとつで、対象から注目すべき要素を重点的に抜き出して他は無視する方法である。

https://goo.gl/soXPyb
> ▼誤解されがちな、「抽象化」という言葉
> 結構な人々が抽象化を「曖昧にすること」とか思っていて、抽象絵画は「なんか曖昧な絵」みたく思っているので始末に負えない。
> まず「抽象(abstraction)」っていうのは、「物事の共通部分を抽出して把握すること」だ。
> 「対象物の特徴をつかみ、枝葉を切り捨てた本質をとらえる」思考力を抽象化思考力と呼びます。
> コンサルタントが「抽象度をあげろ」というときには、実は「抽象的にしろ」とは言っていません。「概念化して語れ」と言っているのです。
0853デフォルトの名無しさん垢版2017/06/18(日) 22:30:11.78ID:dLIsPmeH
具体的実装(抽象化の逆)とか言ってるからこれも引用しておくべきだったw

> 抽象化とは、一般化(上位の概念に包括)することです。例えば亀→両生類→動物→生物という具合に、上位の分類の言葉に置き換えていくことです。
0854デフォルトの名無しさん垢版2017/06/18(日) 22:32:10.52ID:ZkAshefq
>>852
お前が抽象化できんかったからドアが残ったって言いたいんだろ?
知ってるってw
ハカセそれ抽象化ちゃうw細分化やw
0855デフォルトの名無しさん垢版2017/06/18(日) 22:33:52.30ID:dLIsPmeH
>>854
ドアが残ったってなんだ?
またお前が言い出した言葉を
俺が言ったことにしたいのか?

お前が言い出した言葉に対して、「知ってるってw」って
なに自分で自分にレスしてるんだ?

妄想も大概にしろ
0856デフォルトの名無しさん垢版2017/06/18(日) 22:34:51.41ID:dLIsPmeH
「ドアが残った」 = それは細分化や

これも意味がわからん。
こいつバカなのか?
0857デフォルトの名無しさん垢版2017/06/18(日) 22:38:08.14ID:LYWH9ARf
双方何が言いたいのかわからん
0858デフォルトの名無しさん垢版2017/06/18(日) 22:38:14.46ID:ZkAshefq
>>855
端的に言ってお前支離滅裂だぞ
少なくとも今夜俺は
お前に抽象化のなんたるかを垣間見せてやったのだから
明日からもう少しまじめに勉強しろよ
まあ今夜は恥ずかしくて顔から火がでてるだろうから
多少の発狂は仕方ないけどなw
0859デフォルトの名無しさん垢版2017/06/18(日) 22:40:28.64ID:dLIsPmeH
> お前に抽象化のなんたるかを垣間見せてやったのだから

え? どれ?
具体的実装の話をすること?

それは抽象化の逆だけど?
0860デフォルトの名無しさん垢版2017/06/18(日) 22:42:55.55ID:dLIsPmeH
これ、自分のことを話してるのかな?

> 端的に言ってお前支離滅裂だぞ
ID:ZkAshefq が支離滅裂

> 少なくとも今夜俺は
> お前に抽象化のなんたるかを垣間見せてやったのだから
ID:ZkAshefq に俺が見せてやった

> 明日からもう少しまじめに勉強しろよ
ID:ZkAshefq が勉強しろ

> まあ今夜は恥ずかしくて顔から火がでてるだろうから
ID:ZkAshefq が恥ずかしくて顔から火が出てる

> 多少の発狂は仕方ないけどなw
ID:ZkAshefq が発狂している。


本当は自分のことなのに、それをごかます
幼稚なやつがやる手段だなぁ
0861デフォルトの名無しさん垢版2017/06/18(日) 22:44:07.16ID:ZkAshefq
コイツは根本的に馬鹿なのか?
はたまた恥ずかしすぎてトボケてるだけなのか?
いまのところ前者が優勢ですけどねw
0862デフォルトの名無しさん垢版2017/06/18(日) 22:44:08.65ID:dLIsPmeH
>>857
俺が言いたいのはこれ(三度目のコピペ。二度目はID:ZkAshefq にもう一度書けと言われて書いたのに無視されたw)

それは現実世界のドアの話だろう?

ゲームの世界のドアは、現実世界を参考にできるが
ゲーム特有のドアという仕様を作る。

3Dゲームであれば、ドアには開く閉じるという状態は必要ないだろう
なぜなら物体をすり抜けられないという仕様と
蝶番を支点にドアを動かせるという仕様があればよいからだ

だけど2D RPGみたいなドアであれば、ドアの状態というものがあってもよい
開いているドアであれば、その上を移動することができ、
取っじているドアであれば、その上に移動することはできない。

このようにオブジェクト指向は現実世界の物シミュレートためのものじゃなくて
作りたい仕様を、みんなが持っている現実世界の共通認識を使って
わかりやすくする表現するための技術なんだよ

それにしても現実世界のドアについての人間の認識ってのも面白いよな。
ドアからすれば、物理的にはどういう位置にあるかでしかないのに、
人間は「開いている」「閉まっている」というドアの状態として認識しているわけだ
この認識、利用しない手はない!
0863デフォルトの名無しさん垢版2017/06/18(日) 22:45:29.07ID:dLIsPmeH
>>857
オブジェクト指向は抽象化して考えるためのものでもあって
どういう具体的実装であるかは置いといて、
「ドアが開いてる・開いてる」という状態で表現できるわけよ
0864デフォルトの名無しさん垢版2017/06/18(日) 22:50:00.87ID:ZkAshefq
もはや完全に意地になってるなw
学習できない奴の特徴まんまw
0867デフォルトの名無しさん垢版2017/06/18(日) 23:30:56.67ID:LYWH9ARf
おまえらがどう対立してるのかがわからん
オブジェクト志向には色々な側面があるんだし、その二つは別に対立せん気がするが
0868デフォルトの名無しさん垢版2017/06/18(日) 23:35:28.24ID:dLIsPmeH
対立じゃなくてオブジェクト指向は現実世界のものをシミュレート
するものじゃないってことを言ってるだけだよ。

オブジェクト指向で現実世界のあれができないこれができないっていうのは
的外れだってこと

ま、そもそもオブジェクト指向で「ドア」を実装するにはどうすればいいだ?って
ドアというオブジェクトを持ってきてる時点で、
オブジェクト指向は人間の認識と相性が良いんだってわかるんだけどねw
0869デフォルトの名無しさん垢版2017/06/18(日) 23:57:27.96ID:LYWH9ARf
あ、違うID:ZkAshefqは俺にレスしてないのか
すまんやっぱり>>867はなしで
>>868
主張のまとまりがいまいち良くないけど、好意的に解釈する限り言ってることは間違ってないと思うよ
0870デフォルトの名無しさん垢版2017/06/19(月) 01:13:21.02ID:9pZo4esm
どっちも主張がよーわからんが
ID:ZkAshefqを抽出したらびっくりするほどなんにも言ってなかった。
「ばーかばーかおれの勝ちィ!」しか書いてなくね?
なんでスレ進んでんの?
0871デフォルトの名無しさん垢版2017/06/19(月) 01:19:07.10ID:JcFW0m+v
https://ja.wikipedia.org/wiki/Simula
Simula 67 ではオブジェクト、 クラス、サブクラス、継承、動的束縛(仮想関数)、
コルーチン、 ディスクリートイベントシミュレーション、ガベージコレクションの機能をもち、
オブジェクト指向プログラミングの基本概念はすべてここで発案されているといえる。

Simula はプログラミングパラダイムとして最初のオブジェクト指向言語であると考えられる。
その名前が示すように Simula はシミュレーションを行うために設計され、
その必要性から今日のオブジェクト指向言語で使われる多くの機能のためのフレームワークを提供した。
なお、Simula 当時「オブジェクト指向」という言葉はまだない。
この用語はアラン・ケイが Simula の概念として70年代ごろに使い出したのが始まりといわれている。
従ってその意味では Simula が世界最初のオブジェクト指向言語であり、
Simula は「オブジェクト指向として再認識が可能な最古の言語」ということができる。
0873デフォルトの名無しさん垢版2017/06/19(月) 01:27:16.04ID:l1liGy+g
志村 けんは、日本のコメディアン、お笑いタレント、司会者。ザ・ドリフターズのメンバー。
生年月日: 1950年2月20日 (67歳)


https://ja.wikipedia.org/wiki/Simula
志村(67) ではオブジェクト、 クラス、サブクラス、継承、動的束縛(仮想関数)、
コルーチン、 ディスクリートイベントシミュレーション、ガベージコレクションの機能をもち、
オブジェクト指向プログラミングの基本概念はすべてここで発案されているといえる。

志村 はプログラミングパラダイムとして最初のオブジェクト指向言語であると考えられる。
その名前が示すように 志村 はシミュレーションを行うために設計され、
その必要性から今日のオブジェクト指向言語で使われる多くの機能のためのフレームワークを提供した。
なお、志村 当時「オブジェクト指向」という言葉はまだない。
この用語は 荒井・注 が 志村 の概念として70年代ごろに使い出したのが始まりといわれている。
従ってその意味では 志村 が世界最初のオブジェクト指向言語であり、
志村 は「オブジェクト指向として再認識が可能な最古の言語」ということができる。
0874デフォルトの名無しさん垢版2017/06/19(月) 01:28:38.27ID:l1liGy+g
>>871
シミュレーションをするための言語を作ると
オブジェクト指向になるってのは
やはりオブジェクト指向は現実世界の人間の認識と
相性がいいってことなんだろうね。
0875デフォルトの名無しさん垢版2017/06/19(月) 01:44:56.66ID:9pZo4esm
>>871
毎回思ってることだけど、アランケイのオブジェクト指向のポイントは
むしろメッセージセンドでオブジェクトに命令を送るという方式の発案なので
(さらにいうと、インスタンスを作るのにクラスそのものに「複製を作れ」と命令して作らせる
言語システム(予約語)から離れてクラスが自律的に動く思想の方)
Simulaはかなり毛色の違うオブジェクト指向だし
言ってしまうとこれがカンチガイされたままオブジェクト指向だと思われた結果
C++というそびえ立つクソの山が産まれて業界を何十年も混乱に陥れた元凶だから
Simula持ってきて「オブジェクト指向とは〜」ってやった瞬間

お話にならないぐらいオブジェクト指向を理解していないバカが来た。

で話が終わるんだけど。
0876デフォルトの名無しさん垢版2017/06/19(月) 01:57:02.13ID:l1liGy+g
そういやエージェント指向ってどうなんたんかな?
昔、15年ぐらい前に学生だった時に先生がこれからはエージェント指向だって言ってたんだが
その説明きいて、俺はそれってオブジェクト指向+メタデータじゃね?程度に思ってた。

オブジェクトが自律的に仕事をする。みたいな事を言ってたんだが、
それを実現するにはどんな要望であっても、それを実現するためのモジュールが存在し
その要望を完璧に判断してモジュールを選択できるAIでも搭載してなきゃできないような
ものだったのでエージェント指向でもなんでもないし実現は不可能と思っていたが。

まあエージェント指向とやらにはさっさと見切りをつけたので
俺が間違って理解してるんだと思うけどねw
でも事実としてオブジェクト指向を置き換えるものにはならなかったようだね。
0877デフォルトの名無しさん垢版2017/06/19(月) 02:06:51.24ID:l1liGy+g
>>875
シミュレーションをするために言語を作ったけど、
本来の用途としてはあまり使われず、(よくよく考えてみれば
シミュレーションなんてそんなにするか?ってことなんだろう)

副産物として生まれてオブジェクト指向の技術の基礎とでも
呼べるようなものが独立しそれが洗練されてオブジェクト指向言語
として生まれ変わったってことなんかね。

UMLも似たようなもんだよね。元々はオブジェクト指向分析や設計の方法を
色んな人が考えていたけど、それぞれを比較検討する時、それぞれで図の書き方が
異なっていたので、分析や設計方法が色々あるのはわかる。だけどせめて図の書き方
ぐらいは統一しようじゃないかって生まれたもの。

でもオブジェクト指向の分析や設計方法はみんな飽きてしまったのか話題にならなくなり
UMLという図の書き方だけが広まったと。
0878デフォルトの名無しさん垢版2017/06/19(月) 08:54:27.70ID:1iazHqgp
歴史的な起源に拘らない人と、
「もともとはこうだったのに変質してしまった。クソが!」と思う人がいるのだなあ。

と感じました、まる
0880デフォルトの名無しさん垢版2017/06/19(月) 11:06:11.95ID:j3p5BJjc
ストラウストラップとケイの“オブジェクト指向”は別物なので混同せずちゃんと区別したほうがよい

ストラウストラップの“オブジェクト指向”はSimulaスタイルのクラスを抽象データ型(ADT)とみなして使うアイデア
抽象データ型の提唱者のリスコフ、Simulaの設計者たち(ダールとニガート)はもちろん、メイヤーも同様のアイデア同時期に提示している
抽象データ型というのは簡単にいうと「ユーザー定義型」のことで言語組み込みの具象データ型に対してこう呼ばれる
OOPの古典的三点セット「カプセル化・継承・ポリモーフィズム」に象徴されていて
カプセル化は抽象データ型の要件、継承とポリモーフィズムはクラスを使う際のオマケの機能を表わしている
ただ、早々にクックらにより継承を使ってサブタイプを表現することには問題が生じうることが指摘されていて
また動的型のダックタイピングのような自由度を得るためにインターフェース(プロトコルなど別の呼び名も)が考案され
現在はそれが汎用されている

一方、ケイの“オブジェクト指向”はSimulaのオブジェクトにメッセージの受け手を担当させるアイデア
メッセージングはあくまで方便で狙いはその先の設計・実装・運用等、あらゆる局面での「遅延結合の徹底」
遅延結合というと実装のみに固執してしまう人がいるから「決定の遅延」といった方がよいかも
Smalltalk-72はこのアイデアを元に、クラスはJSのクラスのような関数っぽい性質で実現された
このときはメソッドも関数というよりLISP等のリーダーマクロのようなメッセージとなるトークンストリームを順次処理する手順が記述された
次の世代のSmalltalk-76からはSimulaスタイルのクラスが取り込まれ、メソッドも単なる関数になり
前者のオブジェクト指向もそれなりに意識されるようになったので同じSmalltalkでも
Smalltalk-72は純粋なメッセージングのOOPL、Smalltalk-76以降はADPとメッセージングのキメラと考えた方がよいので
もしケイのメッセージングのOOPの考え方に興味があるならPharoやSqueakのような最新のSmalltalkではなく
エミュレーター等で提供されているSmalltalk-72をやるほうがいい
https://ubiteku.oinker.me/2016/05/09/what-is-oo-all-about/#comment-65
ちなみにアクター理論はこのアイデアを実行時の並行性に応用し定式化を試みたもの
0882デフォルトの名無しさん垢版2017/06/19(月) 16:38:13.20ID:LZvrLoRE
決定の遅延とは即ち実行時に決定するということ
つまりデータと処理の抽象化を徹底するということだ
0883デフォルトの名無しさん垢版2017/06/19(月) 16:49:21.59ID:LZvrLoRE
データの抽象化を徹底すると型とクラスが無くなる
型によってデータ長も処理の方法も変わるのが煩雑さの根源だ
0884デフォルトの名無しさん垢版2017/06/19(月) 19:55:43.12ID:/Mgza80D
もともと、コンピュータが巨大にそしてネットワークで接続されると
離れたユニットに「この処理をお願いします」と頼むことになって
シーケンシャルな処理待ちしていたらコンピュータが止まっちゃうし
周りの環境も実行時に刻々と変化してゆくから
オブジェクトにはある種の他と切り離された自律性がいるよね。なのに
なぜか21世紀のインターネット時代に「いいや!カッチリ制御して
他に影響が出ないように書ければこの『世界が勝手に変化するバグ』は排除できるはずだ!」
という謎のカルトが一部で流行り出してるのがどうにもよくわからないw
0885デフォルトの名無しさん垢版2017/06/19(月) 21:05:37.05ID:KwjLNCYt
ガイジ
0886デフォルトの名無しさん垢版2017/06/19(月) 23:09:44.33ID:g4cBDSU6
歴史的にオブジェクト指向の後にテンプレートとかジェネリックとか言われるのが導入されたけど、継承とかより移譲が重宝されてる辺り、ジェネリックだけで十分じゃね?って気がしなくも無い。
0887デフォルトの名無しさん垢版2017/06/19(月) 23:22:30.80ID:l1liGy+g
C++以外にテンプレートがある言語ってあるの?

C++のテンプレートは本来ジェネリック程度の機能で良かったのに
ちょっと道を外したら、意外と高度なことができることが分かっちゃって
本来の目的から大きくはずれてコンパイル時コードジェネレータみたいな
もんになっちゃったでしょ?
0891デフォルトの名無しさん垢版2017/06/20(火) 23:04:56.68ID:v+vDltnD
Haskellでガンガンよく使う処理を個人ライブラリ化なう。

Myfunc.hs
1:module Myfunc where
2:
3:import Data.List
4:import Text.Printf
5:
6:consnum::(Int,String) -> String
7:consnum (i,xs) = printf "%4d:%s" i xs
8:
9:fline f = unlines.f.lines
10:
11:fnumbering f = fline ((map consnum).(zip [1..]).f)
12:
13:numbering = fnumbering id
14:
15:revnumbering = fnumbering reverse
16:
17:allrevnumbering = fnumbering (reverse.map reverse)
18:
19:searchword w = fline (filter (isInfixOf w))
20:
21:putfc (f,c) = printf "%s\n%s" f c
22:
23:mulfileput fs f = mapM readFile fs >>=
24: return.(zip fs).map f >>=
25: mapM_ putfc
0892デフォルトの名無しさん垢版2017/06/20(火) 23:05:26.93ID:v+vDltnD
number.hs
1:import System.Environment
2:import Myfunc
3:
4:main = getArgs >>=
5: \fs -> mulfileput fs numbering
6:
revnumber.hs
1:import System.Environment
2:import Myfunc
3:
4:main = getArgs >>=
5: \fs -> mulfileput fs revnumbering
6:
searchword.hs
1:import System.Environment
2:import Myfunc
3:
4:main = getArgs >>=
5: \(w:fs) -> mulfileput fs ((searchword w).numbering)
6:
0894デフォルトの名無しさん垢版2017/06/21(水) 00:42:37.70ID:Mt9AmAoV
ん。
だってオブジェクト指向言語使ってた時って、ここまで似たようなコード書かなくて良いくらいライブラリ化出来たことなかったんだもん。
0896デフォルトの名無しさん垢版2017/06/21(水) 01:08:07.93ID:Mt9AmAoV
PythonやRubyのopenと大差ないと思うが。。。
嫌ならもっと低レベルの関数もあるよ?
0898デフォルトの名無しさん垢版2017/06/21(水) 07:08:04.36ID:n4ESO8N1
猫ドアは後出しでドアの要件増やされるけどインターフェイスで振る舞いを追加してけば対応可能じゃないの

オブジェクト指向言語的に考えたら
0901デフォルトの名無しさん垢版2017/06/21(水) 08:32:01.05ID:S2UygZ3z
new ってなんなのか、なぜ必要なのか教えて、
オブジェクト生成元クラスのコンストラクタ関数の結果を得るだけなら、
Foo obj = Foo();
とすれば new なくても書けるのに、なぜ new を書く必要があるの?
0902デフォルトの名無しさん垢版2017/06/21(水) 08:55:18.55ID:BZXMZb7j
newがあるから僕らはそれがコンストラクタを呼ぶものだと知ることができる
newがなければ何をすれば良いのかわからない
コンパイラの気持ちになって考えろよ
0903デフォルトの名無しさん垢版2017/06/21(水) 09:09:53.08ID:mDRh5T94
newをかかなくていい言語をさがそう
0904デフォルトの名無しさん垢版2017/06/21(水) 09:11:42.85ID:mDRh5T94
C++の例

Base *base_pointer = new Base();
Base base();
0905デフォルトの名無しさん垢版2017/06/21(水) 09:19:49.52ID:mDRh5T94
pikeという言語は、newをつかわない

bird tweety = bird("Tweety", 0.13);
tweety->eat("corn");
tweety->fly();
tweety->max_altitude = 180.0;

fish b = fish("Bubbles", 1.13);
b->eat("fish food");
b->swim();

animal w = fish("Willy", 4000.0);
w->eat("tourists");
w->swim();

Inheritance | Object-Oriented Programming | Beginner’s Tutorial - Pike Programming Language
https://pike.lysator.liu.se/docs/tut/oop/inheritance.md
0908デフォルトの名無しさん垢版2017/06/21(水) 11:13:54.44ID:+MSTc8BP
>>902
コンストラクタはクラス名と同じって制約があるんだから、コンパイラの気持ちになったらnewなんて別にあってもなくてもいいでしょ
人にわかりやすいようにしてあるだけ
なにがコンパイラの気持ちだアホ
0909デフォルトの名無しさん垢版2017/06/21(水) 11:19:25.58ID:ooAgeRH5
パラメーターがないとややこしいからある場合で考えると
(new Foo)(p1,p2,p3) ととらえるか、new (Foo(p1,p2,p3)) と捉えるかの感覚の違いじゃない?
前者なら宣言的に「新しくFooのインスタンスを作って(初期化パラメーター渡して)るんだな」感が出てnewはあったほうがいいし、
後者なら「新しいFooのインスタンスを作る関数のFoo()を呼んでるのにnewなんて余計やろ?」ってなる

従ってコンストラクタとしてFooを定義する言語や、クラスがそもそも関数的な存在の言語ならnewは蛇足
0912デフォルトの名無しさん垢版2017/06/21(水) 11:46:29.64ID:v7daEmTS
>>908
> コンストラクタはクラス名と同じって制約があるんだから、コンパイラの気持ちになったらnewなんて別にあってもなくてもいいでしょ
class Foo { }
function Foo() { }
0913デフォルトの名無しさん垢版2017/06/21(水) 11:48:18.80ID:v7daEmTS
class Foo { }
function Foo() { }
が両立する言語の場合、
a = new Foo(); // Fooクラスのコンストラクタ
b = Foo(); // 関数Fooの呼び出し
を区別する必要があるから、newが必要
0919デフォルトの名無しさん垢版2017/06/21(水) 14:21:56.72ID:L1LFWazB
new を付けなかったら、インスタンスが作られないから、
this が正しく、インスタンスを指さない

JavaScript だと、prototype 継承が動作しない
0922デフォルトの名無しさん垢版2017/07/01(土) 23:37:05.45ID:Tp0p2tiJ
まぁ言ってる意味は分からんでもないんだよな
コンパイラはFooがクラスか関数か、何なのか知ってるから
区別できるよねっていう
ただし意味解析をしなければFooが何なのか分からない
newがあれば構文解析だけで何をしようとしているかわかる
Fooが何かのか解析するまでもなく、字面の並びだけで関数呼び出しなのか
インスタンスの生成なのかの区別がつく
いざコンパイラを作るとなったらこの差はでかい

あとなんつーか、そういうこと言い出したら
(int i = 0; i < 100; ++i ) なんていう並びの書き方はfor文の時にしか使わないんだから
「for」って要らなくね?とか、goto ERR;って書くけど、ERRがラベルであることは
コンパイラは知っているんだから「goto」って要らなくね?とか
0923デフォルトの名無しさん垢版2017/07/01(土) 23:45:05.96ID:N+ZXroXE
Foo()というメソッドが定義されてなければnewなしだとコンパイルエラーになるんじゃないの...
0924デフォルトの名無しさん垢版2017/07/02(日) 00:07:24.31ID:yqVk05l0
コンパイラはソフトウェアにとって重要なものであるので
ちゃんと専門の学問があってセオリーがある
必ずしもセオリー通りにする必要はないが、いちおうセオリーがある
セオリーに従えばコンパイラは
字句解析→構文解析→意味解析、というステップを踏んで
プログラムを解析することになっている
ここで、Fooがクラスであるか関数であるかによって
インスタンス生成か関数呼び出しか、切り替えるという文法にしてしまうと
意味解析をしなければ構文解析ができない、という逆流現象が発生してしまう
また、コンパイラ生成器にBNFか何かを食わして自動で構文解析のコードを生成してもらうと
思っても、意味解析をしなければ構文が判明しない箇所のある文法では都合が悪いじゃろ
ただし、セオリーはセオリーでしかなく、従わないことも多々ある
たとえばC++の字句解析において、これは最長一致であるので
「>>」は右シフトと判断されそうなものであるが
出現場所によっては「>」と「>」の二つに分解される
これは字句解析がその後の工程であるはずの構文解析を先回りして少しだけ
してしまっている状態
0925デフォルトの名無しさん垢版2017/07/02(日) 00:07:47.85ID:0SO6fajC
>>922
> コンパイラはFooがクラスか関数か、何なのか知ってるから
> 区別できるよねっていう

知らないぞ?っていうかJavaScriptにおいて
クラスは関数と全く同じもの。
0926デフォルトの名無しさん垢版2017/07/02(日) 00:11:14.19ID:0SO6fajC
なんかニワカが長文書いているようだが、
JavaScriptにclassキーワードが追加されたのは比較的最近。
互換性を保つ上で、classキーワードは関数に変換される。

また
function Klass と書けばクラス
function func と書けば関数
というふうに先頭が大文字か小文字かで区別する
というのはあるがこれは慣習であって言語仕様ではない。
0927デフォルトの名無しさん垢版2017/07/02(日) 00:14:28.75ID:yqVk05l0
JavaScriptの話などしていないから関係ない
なぜなら元の>>901の質問者のコードはどう見てもJavaだから
>>919あたりで何故か脱線したようだけど、これは全くのノイズであるから関係がない
0929デフォルトの名無しさん垢版2017/07/03(月) 06:49:00.62ID:rdvbpUW5
オブジェクトが請け負う役割の範囲が未だよく分からん。

例えば、武器を装備するという行為は、
オブジェクト自身に機能を持たせるのか、
actorを第一引数とする処理を別に作るのか。

対象を省略できるからオブジェクトに実装したりするけど、コンテキストの依存性などの問題でゲームマスター的なクラスに処理を任せるべきだなと思ったり。
0930デフォルトの名無しさん垢版2017/07/03(月) 07:34:00.67ID:Rzh0OD1D
「武器を装備しろ」と命令したらあとは当該クラスがよしなにやって
こっちには結果教えてくれればいいだけなので
その「役割の範囲」そのものが当該クラス任せです。
クラスが自分でやっても、武器総合管理クラスに聞いてても
上位は感知しないことで切り離してるので。
0934デフォルトの名無しさん垢版2017/07/03(月) 23:00:58.77ID:c364q6zP
chinko.equip(manko)
0937デフォルトの名無しさん垢版2017/07/05(水) 21:55:54.95ID:QXr7Yy+H
オブジェクト試行の「オブジェクト」っていうネーミングって
誤解を招かないか、
どっちかというと「モノ」じゃなくて仮想的な「生命体」じゃない?
だって動きを持ってるし、誕生して活動して死ぬわけじゃん。
「モノ」なのはコンストラクタやメソッドでやり取りされる「引数」
の方だろ。
「プロパティ」は「生命体の所有物」だと思えばスッキリする。
なのに生命体の方をオブジェクトと言うのはおかしいよ。
クラスはその生命体の「家系」みたいなもんだな。
両親がいる必要がないから単細胞生物の分裂のほうが近いか、
クラスは「遺伝子情報」だな、これでかなりスッキリするじゃないか。
0938デフォルトの名無しさん垢版2017/07/05(水) 22:12:07.95ID:odMt6Ynp
つまり美少女の母親もまた処女懐胎した美少女なわけだな
0941デフォルトの名無しさん垢版2017/07/06(木) 00:22:32.98ID:O802MHgz
>>937
新鮮な意見だな。
コードと現実は違うって概念のカテゴリー分けに使われてるだけだと思った。
0943デフォルトの名無しさん垢版2017/07/06(木) 01:40:25.53ID:9sJW4q9K
じゃああなた方はバイナリの0と1をCPUの信号レベルで
全部機械的に把握できるんだな?すげえなぁ、さすが
コンピュータの熟練技術者は違うね。

言語化してるんだから抽象的思考は重要に決まってんだろ。
0951デフォルトの名無しさん垢版2017/07/06(木) 12:23:55.42ID:yrqFUwOI
少しずつまともに美少女うんこ問題を議論できる土台が出来てきたようだな
0952デフォルトの名無しさん垢版2017/07/06(木) 12:27:47.00ID:jsnas7L+
何を面白がるかみたなもんにこそ知性が出ちゃうと思ってる
悲しいね
自覚が無いのか意固地になっちゃってるのか知らんけど
0953デフォルトの名無しさん垢版2017/07/06(木) 18:21:22.89ID:j+3WJv+Z
モデルは問題解決のために設計するので、
まったく的外れ。

世の中を表現したいわけじゃないし、
世の中に似せる必要も全くない。
0954デフォルトの名無しさん垢版2017/07/06(木) 19:22:23.33ID:0T2UvbzF
なんか最近「モデル」って言うの馬鹿の間で流行ってるの?w
0956デフォルトの名無しさん垢版2017/07/06(木) 19:40:14.63ID:rLOZYnLv
オブジェクト指向ってDBのエンティティを拡張したものだろ

1事実1箇所と考えたら現実に当てはめないとダメだろ
0959デフォルトの名無しさん垢版2017/07/06(木) 20:45:03.97ID:ecitQSu4
エンティティとオブジェクトは対応するものだよ
0960デフォルトの名無しさん垢版2017/07/06(木) 20:47:16.64ID:ecitQSu4
エンティティからクラスを自動生成するのが今のやり方
対応しないとしたら正規化できてない
0962デフォルトの名無しさん垢版2017/07/06(木) 23:39:48.30ID:x/UayICR
対応と言われても抽象的で分からんな。
エンティティは実態でオブジェクトはその射影だよ。

何を持って対応とするの?
エンティティとオブジェクトで可逆性は保証されてないけど
0964デフォルトの名無しさん垢版2017/07/07(金) 00:06:20.53ID:ZLKHtWHA
そーゆーさ、入れポン出しポンっていうの?超シンプルなCRUDの経験しかない奴が
オブジェクト指向とはをなんぞやを語るのやめてよマジでww
0965デフォルトの名無しさん垢版2017/07/07(金) 05:43:32.56ID:1OiH67XQ
>>943
何が言いたいのかわからんが、プログラミングしたい事象を、そのままオブジェクトに丸ごと落とし込むんじゃ無くて一旦分解して考える。
共通点とか過去の資産使えそうなのはそうする。
ここは他でも使えそうとかあったら分けておく。
再利用出来そうな場所と、そうでない場所を分ける。

人と車って系統的に全然違うからオブジェクト指向の動物クラスみたいなのじゃ全然違うだろ?
でも移動出来るってのは同じだ。
食事と燃料補給は違うが、エネルギーが無いと動かないってのも同じ。
そうやって全然関係無さそうなものの共通点を考えると抽象的なクラスが出来てくる。
現実のオブジェクトと違うけど、より本質に近いオブジェクトになる。
0966デフォルトの名無しさん垢版2017/07/07(金) 07:21:29.95ID:5Fyb0GDQ
>>965
人と車を動くという共通点によって同じ操作をインターフェイスで作るみたいな感じ?

10画面程度の業務システムしか組んだことないから知らんのだけど大規模システムはそんな風にオブジェクト指向で設計するの?

オブジェクト指向入門見て分類学的に設計するものだと思ってた
0967デフォルトの名無しさん垢版2017/07/07(金) 07:25:14.64ID:5Fyb0GDQ
966だけど、ゲームでオブジェクト指向すると動くという操作は人も車も変わらんか

業務システムじゃエンティティが正義だと思うけど、ゲームや制御じゃ事情や適用方法が違うんだろうね

制御は構造化しかやったことないけど
0968デフォルトの名無しさん垢版2017/07/07(金) 07:33:06.32ID:DRnLdr12
>>937
アラン・ケイのメッセージングのオブジェクト指向がまさにその着想だな

http://worrydream.com/EarlyHistoryOfSmalltalk/
My biology major had focused on both cell metabolism and
larger scale morphogenesis with its notions of simple mechanisms
controlling complex processes

でも残念ながら現在の主流は抽象データ型のオブジェクト指向
クラスやそれに準ずる言語機能をユーザー定義型として扱うストラウストラップらの着想が根底にあり
生命体とのアナロジーはそぐわない
0969デフォルトの名無しさん垢版2017/07/07(金) 07:44:57.59ID:JJYyKRQq
大規模かは知らんが、最近は継承はあまり好まれなくなった。
委譲やインターフェースによる多態性のが好まれる。

これはおいらの推論だが、昔はCUIからGUIに移行するときの規模に対応するためにOOPが誕生した。
今度はPCやスマホなどの多様なGUI、webプログラミングでビューとロジックを分ける必要が出てきた。
ここにOOPは対応しきれてない。

そこで関数型言語が注目されたりした訳だが、今のOOPは関数型言語と同じ所を目指してる最中な気がする。
なぜなら、関数型言語にはコード資産が無いけどOOPには有るから。
全く違うプラットフォーム行くのは怖いから。
実際、言語は優秀でもツール類が絶望的に足りない。
0970デフォルトの名無しさん垢版2017/07/07(金) 08:16:46.35ID:G2hd19q1
継承を使わないのは、複雑になるから。
多重で継承すると、デバッグが大変。

継承でロジックの一元化を狙うより、
1番トップの1階層目ぐらいの継承で妥協しておいた方が、
ソースを体系化しやすく、プロジェクトの見通しが良くなる。
0971デフォルトの名無しさん垢版2017/07/07(金) 08:31:15.22ID:SENaJwbT
>>970
言語として多重継承できる言語の方が少ないと思う

あとロジックの一元化は継承とまた別の話だよ
0972デフォルトの名無しさん垢版2017/07/07(金) 08:42:08.67ID:G2hd19q1
>>971
多重じゃなくて、継承の継承でした。
垂直の継承。

継承がロジックの一元化の全てではないが、
手法の一つなので別問題にする必要もないと思うが。
どう別問題に扱うの?
0974デフォルトの名無しさん垢版2017/07/07(金) 08:54:25.16ID:8UX+Q+HA
オブジェクトが必ずしもDBとだけ対応してるってのは
間違いじゃないかな?
関数オブジェクトとかあるし、
GoFのデザパタとかで出て来るオブジェクトは全然DB関係ない
のばっかりじゃん。
JavaScriptやUIプログラミングもオブジェクト指向化してるけど
UIなんてDBと無関係だぞ。
俺は >>937だけど、JavaScriptやっててオブジェクトは「生命体」
だと思ったんだよ、「xxxer」 ていうオブジェクト作ること多いじゃん、
だから「xxxをする人」ってことでしょ。
DIとかオブジェクトを引数としてやり取りしたり、
メソッド内で他のオブジェクトを new したりすると何やってんだか
はじめはわからなくなったけど、
「ある生命体Aの部下として生命体Bを『配属』させ、所有物のように受け渡したり、
部下として仕事をさせる」と考えると結構上手く説明がつくことに気づいたんだよ。
0976デフォルトの名無しさん垢版2017/07/07(金) 09:00:08.09ID:U3HkjAD4
クラスあるいはそれに準ずる言語機能を抽象データ型(簡単にはユーザー定義型)として扱う着想において
クラスの継承により部分型を表現するのは危険をはらむということはかなり早い時期に指摘されている
だから言語機能としてのインターフェースが考案され、以降はそれを使って部分型を安全に表現する言語が汎用されている

継承は部分型を表現すること以外に、実装の重複をなくす(簡単にいうとコピペによる分散を防ぐ)役割も担っていたが
初期のインターフェースは実装を持てなかったため、継承のメリットのうち後者は捨てるか、クラスとの併用で気をつけて使うしかなかった

ただ、型クラスやトレイトという考え方や言語機能が考案され、インターフェイスも実装を持てるようになったので
クラス(というか継承)の役割はほぼ終わりつつある
0977デフォルトの名無しさん垢版2017/07/07(金) 09:28:29.21ID:G2hd19q1
>>974
初心者への例え話レベルですね。

客、ウェイター、料理人、冷蔵庫(データベース)

客がウェイターに指示をする。
ウェイターが料理人に指示をする。
料理人が冷蔵庫から材料を取り出す。
でも、プログラム上では冷蔵庫から食材を料理人に渡す人がいる。
現実世界では包丁は料理人が使わないと効果を発揮しない。
プログラム上では、包丁だけあれば食材を切り刻むことができる。

店長は、店員を部下を持つ。
だが、店長の所有物ではない。
店員のリポジトリから、店コードでアクセスするものだ。
店長も店から見れば店の所有物なのだから。

だから、データにアクセスする機能は人オブジェクトにはない。
0978デフォルトの名無しさん垢版2017/07/07(金) 11:35:17.41ID:6eecx6PE
「おいら」さんはいつもの変な子でしょ。
なんか今日はこまめにID変えてるけど。

そうじゃなくて、むかしは大型コンピュータしかなかったから
大きな処理を行うにつれて「ネットワークで繋がった他のコンピュータに処理を委譲する」という
処理形式が現実になってきた。
そうなるともはや処理時間も通信状態も不明な他所のコンピュータで動いてる処理を
シーケンシャルな一意の順番で行ってゆくというのが非現実的になるのが明白で
そういった視点から「こういう処理をせよ」とクラス(独自の処理単位/物理的に別な機械)に命令したら
その単位が他に依存しないで自律的に処理を行う「オブジェクト指向」が提唱された。
(オブジェクトの再利用がどーのというオブジェクト指向とは別物)

そして、現代では「このシーケンシャルに処理が行われるとは限らない」は
薄れるどころかますます重要性を増してる要素なのだけど
なぜか亡霊のように『処理の間に他人が絡まなければ』って
局所的処理があたかもこれからも可能だと"信心"してる
関数型言語とかいうのが地獄の底から這い出してきて
世界の皆が困惑してる。だいたいそんな状況。
0979デフォルトの名無しさん垢版2017/07/07(金) 11:57:04.53ID:U3HkjAD4
>>969
> 昔はCUIからGUIに移行するときの規模に対応するためにOOPが誕生した。

それはアラン・ケイのメッセージングのOOPの話で、継承を前提とした現在主流の抽象データ型のOOPとは関係ないよ
念のためメッセージングのOOPというのは所謂「オブジェクトにメッセージを送って」とかいうお題目を唱えながら
設計・実装・実行・運用と幅広い局面における「可能な限りの決定の遅延」を徹底する考え方ね
http://squab.no-ip.com/collab/uploads/61/IsSoftwareEngineeringAnOxymoron.pdf

>>978
> そうなるともはや処理時間も通信状態も不明な他所のコンピュータで動いてる処理を
> シーケンシャルな一意の順番で行ってゆくというのが非現実的になるのが明白で
> そういった視点から「こういう処理をせよ」とクラス(独自の処理単位/物理的に別な機械)に命令したら
> その単位が他に依存しないで自律的に処理を行う「オブジェクト指向」が提唱された。

そんな「オブジェクト指向」の出自は初耳なんだけど誰が提唱したもの?

ちなみに抽象データ型のオブジェクト指向は、C with Classe(後にC++)のスウストラップのこちらの所謂 what-is 論文が有名
http://dl.acm.org/citation.cfm?id=624721
同時期にEiffelのメイヤー、抽象データ型のリスコフ、SIMULAでクラスとオブジェクトを考案したダールとニガードも
同様の着想(SIMULAスタイルのクラスを抽象データ型として扱い、その継承機構で部分型を表現する)を得ている
0980デフォルトの名無しさん垢版2017/07/07(金) 12:01:56.23ID:xvg52mfm
困惑してるだけなら関数型言語の機能取り入れたりしないだろ。
その再利用とは別のオブジェクト指向ってどうなったんよ。
MVCとかMVVMじゃ無いよね?そんな昔じゃ無いし。
0983デフォルトの名無しさん垢版2017/07/07(金) 12:13:19.21ID:xvg52mfm
>>979
そのsmalltalkやRubyのオブジェクト指向が関数型言語と同じ方向目指してるなって感じてて、でも今の所関数型言語のが相性が良いように思える。
0985デフォルトの名無しさん垢版2017/07/07(金) 12:32:20.58ID:U3HkjAD4
>>981
そりゃ大事だろ
誰がどういう背景でどんなことを目指して考案・発案したかって知らないでどうやって使いこなすのさ?

特に「オブジェクト指向」は同名の違う考え方が混在しているうえに
想像で語られるオレ定義が跳梁跋扈しているから、それらに翻弄されないためになおさらでしょ

>>982
誰が提唱したかを知っていれば、それを冠することで区別が付けやすいってだけの話
同じ「オブジェクト指向」でも異質な考え方があるのを区別しなければならない特殊事情を鑑みてこれは必要なこと
0986デフォルトの名無しさん垢版2017/07/07(金) 12:33:44.47ID:vHHwjjQx
>>983
いいこと言った
つまりオブジェクト指向に継承やカプセル化は
必要ないし害悪ですらあるってことが明らかになってきているってことだな
0987デフォルトの名無しさん垢版2017/07/07(金) 12:35:07.48ID:vHHwjjQx
インターフェイス、つまり型による契約プログラミングこそがオブジェクト指向の本質
0988デフォルトの名無しさん垢版2017/07/07(金) 12:35:11.95ID:SENaJwbT
>>972
あ〜深いヤツは見ててしんどいですね

ロジックの一元化を「このメソッドいろんなところで同じ処理するからまとめたよ!継承したら呼べるよ!」って感じで使ってる所だととても大変
振る舞いを一元化して異なる動作をさせたいメソッドのoverrideで使ってたら苦にはならないよ

手法としては存在するよね?って聞かれたら存在する
でも問題は設計であって継承ではないと考える
0990デフォルトの名無しさん垢版2017/07/07(金) 13:06:08.89ID:xvg52mfm
>>986
ありがとうだけど、継承はともかくカプセル化は必要。
モジュールも広い意味でのカプセル化だからね。
それまで不要とは思わないし、副作用と縁のきれない手続き型言語にカプセル化ある種運命共同体。
0991デフォルトの名無しさん垢版2017/07/07(金) 13:30:17.87ID:XBLDwFYK
結局どこまで行っても、ここで議論されてる事とは
「どう構造化し記述すべきなのか」なんである
0992デフォルトの名無しさん垢版2017/07/07(金) 14:05:53.15ID:vHHwjjQx
>>990
カプセル化が必要なくなるように設計するべき
手続き型に逃げちゃダメ
オブジェクト指向やりたいんでしょ?
0994デフォルトの名無しさん垢版2017/07/07(金) 14:08:59.90ID:vHHwjjQx
手続きをカプセル化するだけじゃただのモジュール指向手続き型
カプセル化が要らなくなるまで設計を洗練させること
これ即ちオブジェクトの正規化なり
0995デフォルトの名無しさん垢版2017/07/07(金) 14:43:00.99ID:G2hd19q1
無駄に正規化したところで、クラスの粒度、階層がバラバラになるからほどほとにしないと無駄だよ
0997デフォルトの名無しさん垢版2017/07/07(金) 18:42:32.82ID:eVPhxI3P
>>992
いんや。
関数型言語したいん。
だから対岸の火事なのん。
0998デフォルトの名無しさん垢版2017/07/07(金) 19:12:56.87ID:8UX+Q+HA
>>977
ごめん、ちょっと言い方間違えたは、別に部下として配属する
必要はないな。
あと、thisって何かイマイチしっくり来なかったんだけど、
「この」って解釈するからどういう意味なのかわからかったが、
「俺の」と解釈しほうがいいと思った。
つまり任意のパラメータを「俺のもの」として保持しておけば、
外部から「こいつの(xxさんの)」として呼び出せるって訳だ。
10011001垢版Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
life time: 96日 3時間 8分 15秒
10021002垢版Over 1000Thread
2ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 2ちゃんねる専用ブラウザからの広告除去
★ 2ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.2ch.net/

▼ 浪人ログインはこちら ▼
https://login.2ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。

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