X



オブジェクト指向ってクソじゃね?
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
垢版 |
2018/08/24(金) 13:32:09.36ID:ifygL6bT
カプセル化(英語:encapsulation)とは、オブジェクト指向を構成する概念の一つで、
オブジェクト内部のデータを隠蔽したり(データ隠蔽)、オブジェクトの振る舞いを隠蔽したり、
オブジェクトの実際の型を隠蔽したりすることをいう。

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

一方、カリフォルニア大学バークレー校の有識者を中心としたインターネットを作った人たちは「階層化の有害性」として
「絶対に使うな」としている。大雑把にいうと、その時は良くても、将来的な改修の際に隠蔽されたデータに
アクセスできないと解決できない問題が出てきて、結果的にデスマーチに陥るというのである。

オブジェクト指向の発案者であるアラン・ケイもコーディング規約(頭文字にアンダースコアを付けるなどの命名規則)で
縛る程度にすることを推奨しており、アラン・ケイが関わったオブジェクト指向プログラミング言語にはどれも「private」
という概念はない。

https://monobook.org/wiki/%E3%82%AB%E3%83%97%E3%82%BB%E3%83%AB%E5%8C%96
0753デフォルトの名無しさん
垢版 |
2018/10/11(木) 17:52:18.63ID:lqVwZR/7
んじゃクロージャ出たから

オブジェクト指向で末端の人、要は上の誰かが作った仕組みやクラス使って自分はそこからオブジェクト弄るだけの人は可能な限りクロージャ使いまくった方がと思うんだよな
よく委譲処理でこのふたつどちらか選ぶ事あると思うんだが末端なら即クロージャ
0754デフォルトの名無しさん
垢版 |
2018/10/11(木) 19:53:44.01ID:hrM+9Jlq
>>714
仕事は範囲が限られているからね
その仕事でやらなければならない範囲だけ出来れば
後は何が出来ようが出来まいが関係なくなるからね
一言で言えば視野が狭い
横文字を多用する人は狭い世界で通じてそれでokになっちゃってる
多種ではないし世界が兎に角狭い
実際ゲームなんかでは敵クラスを作って敵が増えるたびにオブジェクトを生成する
ってやると感覚的に凄く簡単
0755デフォルトの名無しさん
垢版 |
2018/10/11(木) 20:31:48.13ID:m9vsKwrk
>>752
どんな話題が面白いの?
このスレ的にはオブジェクト指向のメリットが説明できなければ
終わりなんだけど
0756デフォルトの名無しさん
垢版 |
2018/10/11(木) 20:34:12.11ID:U1kKB/4M
逆でしょ?説明されれば終わりなのがいやだから
答えが出てるのに、同じことをくり返し聞く
0757デフォルトの名無しさん
垢版 |
2018/10/11(木) 20:38:52.62ID:m9vsKwrk
>>756
え?メリット出てる?
見たことないよ
毎回、バカが長文書くだけで
品質向上なのか工数削減なのか、それが起こるロジックが全くの謎
0758デフォルトの名無しさん
垢版 |
2018/10/11(木) 21:05:36.68ID:o+Pj5MkJ
犬がワン、猫がニャン
→なにそれ美味しいの?

大規模じゃないとメリット説明しにくいよ
→説明できないって、大規模なプログラムを経験して体で覚えろと?

要するに、簡単には説明できないよ
→だったら学習コストとの天秤では?

俺の中ではこんな感じ
0759デフォルトの名無しさん
垢版 |
2018/10/11(木) 21:06:47.80ID:U1kKB/4M
品質向上だし工数削減にもなる

馬鹿はそこでなぜか品質向上と工数削減のために
追加作業が増えるとダメだと話を聞かない
0761デフォルトの名無しさん
垢版 |
2018/10/11(木) 21:48:27.62ID:29n02hV2
いわゆる土方候補生か
0762デフォルトの名無しさん
垢版 |
2018/10/11(木) 22:35:19.32ID:FTrPBrPb
>>753
関数ポインタと汎用のvoidポインタ渡すインターフェイスより明らかに良いとは思うけど、
ガベコレない言語では上手くいかんだろ。
その場合は継承させるしかないっていうc++の選択は間違いじゃない。
0764デフォルトの名無しさん
垢版 |
2018/10/12(金) 00:47:17.48ID:U1NbXGxJ
オレぐらいのレベルでないと
オブジェクト指向は使いこなせない
0765デフォルトの名無しさん
垢版 |
2018/10/12(金) 00:47:48.97ID:U1NbXGxJ
だいたいわかる

低学歴知恵遅れが
ムダにオブジェクト指向あげしてる
0767デフォルトの名無しさん
垢版 |
2018/10/12(金) 07:03:34.63ID:ogDn0rIL
>>762
全く解消されてないだろ。。
キャプチャーしてる変数の寿命を考慮してなきゃならんし、こんなん使わねーわ。
0768デフォルトの名無しさん
垢版 |
2018/10/12(金) 08:23:50.28ID:8+F5vpV5
型の問題と寿命の問題を分離しない
OSとGUIを分離しない
フルスタックな環境を作る密結合指向って感じ
0770デフォルトの名無しさん
垢版 |
2018/10/12(金) 11:04:22.00ID:8+F5vpV5
>>769
その設計にオブジェクト指向が関与していると疑われている
その問題の解決にオブジェクト指向は全く寄与しない、と宣言すれば疑いは晴れる
0772デフォルトの名無しさん
垢版 |
2018/10/12(金) 17:19:28.65ID:5jm0P0/q
オブジェクト指向信者もDI信者も同じ臭いがするね

【Java】DIコンテナって本当に便利か?
http://mevius.5ch.net/test/read.cgi/tech/1219242206/

次は何を担ぐのやら


外国で流行って育っていくのだから、それなりのメリットはあるんだろうけど、なぜか仕事では恩恵にあずかったことはない
0773デフォルトの名無しさん
垢版 |
2018/10/12(金) 20:33:03.38ID:4mK9L0RW
設計のセンスの無い奴はどんな流行が来たって糞な設計しか出来ないんだよなぁ
センスがある奴はなんとなくどんな流行のスタイルでもこなして来るからなぁ
0774デフォルトの名無しさん
垢版 |
2018/10/12(金) 20:41:34.47ID:CecLyO81
どーでもいーけどコーディングの事設計てゆーのいーかげん恥ずかしくね?w
0775デフォルトの名無しさん
垢版 |
2018/10/12(金) 20:45:43.93ID:4mK9L0RW
は?
設計はコーディングじゃねーよw
四角い箱描いて矢印や電線で繋げて遊ぶ奴だぞ。
0776デフォルトの名無しさん
垢版 |
2018/10/12(金) 20:45:57.27ID:SyXP90mj
ある一定以下に対して理解できるような教範が出てこない
だから一部の人しか使えないようになってる
結局は出来る人の間で持て囃されるだけになってしまう
この何か新しいやり方を創造するのと一般に使えるようにする
というのは本来両輪なんだけど
普通以下の人達が使えるようになる教範を作る
というのはかなり難しい上に
それをやる人には余りメリットがないから
なかなか出てこない
だから
オブジェクト指向プログラミングにしても
関数型プログラミングにしてもその他の技術にしても
広く(普通程度以下)使われるのは難しいし
このスレのタイトルみたいな感想を持つしかなくなる
後は自分が出来るけど他の人が出来ないままのほうが出来る人には得だから妨害する
みたいなのが居るくらいだろうかねぇ
0778デフォルトの名無しさん
垢版 |
2018/10/12(金) 21:12:49.59ID:CecLyO81
ガチでわかっとらん奴やったw
0780デフォルトの名無しさん
垢版 |
2018/10/12(金) 21:21:05.43ID:xVyRtSc0
少なくともこのスレにいるような低学歴知恵遅れのドカタには
オブジェクト指向言語を適切に使いこなせない
0781デフォルトの名無しさん
垢版 |
2018/10/12(金) 21:27:17.84ID:d1sPni1g
少なくともこのスレにいるような低学歴知恵遅れのドカタには
オブジェクト指向言語を適切に使いこなせない
0783デフォルトの名無しさん
垢版 |
2018/10/12(金) 23:12:30.21ID:xVyRtSc0
日銀短観のDIは便利
池沼あげのDIはtraitsなみにウンコくさい
0784デフォルトの名無しさん
垢版 |
2018/10/13(土) 10:26:58.14ID:YNebL+WU
今時DIも使いこなせない人材とか組織にとってのリスクでしか無いよ
あっちこっち結合しまくったクソコードを社内リポジトリにばらまくとか悪夢そのものじゃん
0785デフォルトの名無しさん
垢版 |
2018/10/13(土) 10:58:13.65ID:H4Y+M12v
DI使っても結合しまくったくそコードはくそのままだ
業務分析の時点でコケて役割分担がぐちゃぐちゃなんだからDI導入したって解決しない
0786デフォルトの名無しさん
垢版 |
2018/10/13(土) 21:25:17.45ID:YNebL+WU
>>785
DIを使わないから業務分析の時点でコケて役割分担がぐちゃぐちゃになるのでは?
設計者にDIを学習させてDIを使う前提で設計させればそのあたりの分担がキレイになるように意識して設計するようになるよ
0788デフォルトの名無しさん
垢版 |
2018/10/13(土) 22:15:51.44ID:L3Dj2/gz
cのたくさんの構造体にいっぱい変数や関数ポインタもたせて
それ入力にして処理するのと同じ
0789デフォルトの名無しさん
垢版 |
2018/10/13(土) 22:29:25.59ID:HA3RUpZg
DIはたしかにきれいな設計になるが、めんどくて工数がかかる。
作業者にはYAGNIのほうが優先度高いから勝手に採用できない

だからそういうのはトップエンジニアが最初に管理方針としてきめとくもんだ
末端のプログラマーに責任押し付けるのは酷
0790デフォルトの名無しさん
垢版 |
2018/10/13(土) 22:38:19.49ID:HA3RUpZg
今のDIはめんどすぎる
既存コードをいじらないで中身をすげかえる
もっと楽な方法はないものか
0791デフォルトの名無しさん
垢版 |
2018/10/13(土) 22:42:51.86ID:An0DfPZD
DIは言語自体に組み込まれるべきもの
高級言語はどんどん高級になるべきだが
ガベコレ搭載あたりで停滞してしまったからね

本来はDIやデザインパターンやユニットテストや
フレームワークまで高級言語の仕様に含めなきゃいけない
0792デフォルトの名無しさん
垢版 |
2018/10/13(土) 22:44:08.09ID:L3Dj2/gz
インターフェースを決め打ちにしたテンプレート作る間抜けな作りと
大してかわらないからな
0793デフォルトの名無しさん
垢版 |
2018/10/13(土) 22:48:54.83ID:c+yfSqJ1
使用者との合意の無いインターフェースほどクソなモンは無い
独りよがりで考えたものは全部クソなので誰にも見られないうちに捨てて欲しい
0794デフォルトの名無しさん
垢版 |
2018/10/13(土) 22:54:18.52ID:An0DfPZD
逆に言えば使用者との合意のあるインターフェースは問題ない
ということになってしまう。
0796デフォルトの名無しさん
垢版 |
2018/10/13(土) 23:21:29.03ID:An0DfPZD
>>795
あ、そうだって認めたねw

つまり、お前はインターフェースに問題があるとしようとしていたようだが、
俺はインターフェースには問題ないという話への誘導に成功したわけだ
0797デフォルトの名無しさん
垢版 |
2018/10/13(土) 23:38:37.37ID:L3Dj2/gz
クソが余計なことをして
余計にクソなコードを生産するサイクルが途絶えることはない
0798デフォルトの名無しさん
垢版 |
2018/10/13(土) 23:45:30.90ID:An0DfPZD
SEが余計なことをして
クソコードを量産することになるのは
よくある話だな
0801デフォルトの名無しさん
垢版 |
2018/10/15(月) 20:24:46.22ID:vo4hBZ/w
なあ、おまえのクラス内に公開変数作って、そいつをインクルードして関数呼び出し時にポインター参照で指定するなんてインターフェス、誰が言い出したの?
しかも各関数は自前のその公開変数を直接参照して動いてるし。
こんな中途半端なやり方するなら、最初から隠蔽しちゃってくださいよ。
0803デフォルトの名無しさん
垢版 |
2018/10/15(月) 21:16:54.08ID:E6pr56BO
 私たち日本人の、日本国憲法を改正しましょう。
総ム省の、『憲法改正國民投票法』、でググって
みてください。拡散も含め、お願い致します。
0806デフォルトの名無しさん
垢版 |
2018/10/16(火) 07:57:35.98ID:Z3LiiLXa
オブジェクト指向を厚く語るヤツは
お勉強いまいちのヤツが多くて信用できないけど、
さらっとオブジェクト指向で書いたようなライブラリを公開してるヤツが
高学歴というわけでもない不思議な業界だよね
0809デフォルトの名無しさん
垢版 |
2018/10/16(火) 10:44:44.96ID:KsONw+2K
結局関数プログラミングが良い
って書いてある様に見えるけど
オブジェクト指向に対して何がどう良いのかは書いてないように見える
オブジェクト指向の問題点の指摘自体は有ってるように思えるけど
そもそもそういう使い方をするものじゃない
って気がするなぁ
現実世界とどうたらこうたら
こういう書き方をする人は自分からみてほぼ間違えている様に見える
騙された
って書いて有るけど
オブジェクト指向ってそんなに劇的に何かが壮大に変わるわけじゃないんだけど
その辺を誤解しているかオブジェクト指向を宣伝している奴がそもそも捕らえ違いをしている
そう自分には感じる事が多いなぁ
0810デフォルトの名無しさん
垢版 |
2018/10/16(火) 10:49:18.08ID:hiAtkD1Q
現実世界とマッピングさせようとしたらそりゃ上手くいかんし
バナナモンキージャングルになるわな
あほくさ
0811デフォルトの名無しさん
垢版 |
2018/10/16(火) 11:00:52.85ID:sVO7hlJ7
アクセス修飾子について分かりやすい説明しているサイトない?
privateからゲッター → セッターの理由がわかんないんだよな。
publicとの違いがなんなのか
0813デフォルトの名無しさん
垢版 |
2018/10/16(火) 11:07:25.98ID:HqnwAz6t
ゲターもせターもパブリクーにするなら
アクセサーとフィールドの違いはない
0816デフォルトの名無しさん
垢版 |
2018/10/16(火) 13:06:07.08ID:GbK/byr7
>>811
わかんないなら使わなくていいよ
用もないのにゲッターセッターを用意しろってのは間違って広まった悪いスタイルだ

多態したいとか、書かれてるようにログを取りたいとか、アクセサがあるとインスペクタで値が見えて便利とか
なんか用事がある時だけでいい
0818デフォルトの名無しさん
垢版 |
2018/10/16(火) 14:20:20.47ID:cFNbEHw0
言語仕様で何とでもなるものにいちいちゲッターセッター付けるの無駄じゃね?
0819デフォルトの名無しさん
垢版 |
2018/10/16(火) 14:59:03.86ID:8J+M5yKD
それがプロパティなわけだが
ゲッターセッターと機能が重複しててほぼシンタックスシュガーで邪魔
0821デフォルトの名無しさん
垢版 |
2018/10/16(火) 16:52:45.97ID:nQomBRvE
セットなんちゃらって書く場面を考えると
なにかの状態遷移を伴うケースが大抵である
だとしたら、それを具体的に示す関数を書くべきなのでは
初期化が不便だというのもなんか違う

設定するメンバの組み合わせは決めておくべきではないか
それに併せて初期化関数を用意するだけ
0823デフォルトの名無しさん
垢版 |
2018/10/16(火) 17:10:16.39ID:JHQMnpCL
>>821
> セットなんちゃらって書く場面を考えると

セットなんちゃらって書くと思うからいけない。
本当に書きたいことは、属性の変更
0824デフォルトの名無しさん
垢版 |
2018/10/16(火) 18:13:44.49ID:AosmVSTK
いつもクラスの例にでてくるPersonクラスはNameとAgeを持ってるけどあれ適当だよな
Ageは不変じゃないからいつの時点のAgeなのかもわからん

本来は誕生日を持っておいてAgeが必要なときにいつの時点の年齢が欲しいかを引数で与えて計算すべきなんだよな
0825デフォルトの名無しさん
垢版 |
2018/10/16(火) 18:57:36.52ID:PnSVhV/K
言われたらそうだなw盲点だった
0826デフォルトの名無しさん
垢版 |
2018/10/16(火) 19:03:13.54ID:JHQMnpCL
そこででてくるのがプロパティだよ
ageは属性かメソッドかといったら属性だろ?

一見属性にアクセスしているようで、内部では
いろんな処理を行って値を返す。
それがプロパティ
0827デフォルトの名無しさん
垢版 |
2018/10/16(火) 19:04:22.70ID:JHQMnpCL
>>825
盲点でも何でも無いよw

例えば、Configクラスであっても、いつの時点のConfigかわからんだろ?
一年前の設定がほしいかもしれない。
0829デフォルトの名無しさん
垢版 |
2018/10/16(火) 19:22:26.29ID:AzP++FB2
状態状態ってよく悪者にされるけどOOPの肝はのへんににあると思う
#include <iostream>
struct logger {
std::ostream *out;
logger() : out(0) {}
void p(const char *s) {
if (out) *out << s << std::endl;
}
};
void f(logger &l) {
l.p("foo");
l.p("bar");
}
int main() {
logger g;
f(g);
g.out = &std::cout;
f(g);
g.out = &std::cerr;
f(g);
return 0;
}
ログの有効無効なんかをこうやって切り替えるのって
そんなに悪いこと?
0830デフォルトの名無しさん
垢版 |
2018/10/16(火) 19:24:41.24ID:GbK/byr7
Delphiなら配列の構文で引数付きプロパティを扱えたりするが
そんなことするぐらいならpersonからはbirthdayだけ見せて
今何歳かなんて呼び出し側で勝手に計算しやがれって思うわw
0832デフォルトの名無しさん
垢版 |
2018/10/16(火) 19:27:08.86ID:JHQMnpCL
Nameも不変じゃないし身長体重性別だって不変じゃない
商品の値段も不変じゃない
不変のものなってまず無いだろう。

つまりは、オブジェクトの状態の過去のスナップショットを
オブジェクト自身に持たせるのが正しい設計かという話
0833デフォルトの名無しさん
垢版 |
2018/10/16(火) 19:30:01.71ID:GbK/byr7
>>831
だから>>824は時刻を引数で与えるよう提案しているわけだ。最初からそういう話
personクラスが中で勝手に現在時刻を取得してたりしたら複数インスタンスのageの基準がずれたりして
使い辛くてかなわんだろう
0834デフォルトの名無しさん
垢版 |
2018/10/16(火) 19:33:44.42ID:JHQMnpCL
>>833
その理屈だと結婚などでNameが変わることもあるから
Nameにも日時を与えるようにしないといけなくなる
0836デフォルトの名無しさん
垢版 |
2018/10/16(火) 19:35:57.94ID:JHQMnpCL
本質は>>832に書いたとおり

> つまりは、オブジェクトの状態の過去のスナップショットを
> オブジェクト自身に持たせるのが正しい設計かという話
0837デフォルトの名無しさん
垢版 |
2018/10/16(火) 19:37:46.55ID:AosmVSTK
誕生日だけが提供されていたらコードのあちこちで年齢を出すメソッドが別々に書かれるかもしれない
同じ処理が複数で書かれてそれも同じ処理とも限らない

ロジックが散らばるのはよくないからクラスが持つべきではないかと思う
0838デフォルトの名無しさん
垢版 |
2018/10/16(火) 19:38:15.60ID:eMqRZshQ
大小比較のアルゴリズム自体を引数で渡したり、
オブジェクト指向っぽくてエレガントに見えはするけど、
一般プログラマには可読性低いなー
と思ったり。

一昔前のオブジェクト指向設計が売りの会社たちは、
オナニー会社として、まるで奮わなかったもんな

やっぱ適正レベルってもんが大事だよね
0839デフォルトの名無しさん
垢版 |
2018/10/16(火) 19:40:14.57ID:GbK/byr7
>>837
そこは、年齢に限らず単に時刻の差を計算する処理として
dateクラスのメソッドかグローバル関数であるべきでは
0840デフォルトの名無しさん
垢版 |
2018/10/16(火) 19:41:53.17ID:eMqRZshQ
C++はベターCとして、文字列いじるときとか楽できればいいんじゃね?

でもmallocとかメモリ管理が面倒だから、C#やJavaに流れるよね
要員確保できるもの
0841デフォルトの名無しさん
垢版 |
2018/10/16(火) 19:43:35.70ID:AosmVSTK
>>839
間違っても年齢を出す処理はdateクラスに持たせるべきではない

誕生日から年齢を出すのは実は結構めんどくさい
日本での年齢は日本の法律にのっとって決まってる
0842デフォルトの名無しさん
垢版 |
2018/10/16(火) 19:43:50.71ID:eMqRZshQ
だいたいそういうのは業務共通クラスとしてstaticメソッドてんこ盛りで置いておくよね
0843デフォルトの名無しさん
垢版 |
2018/10/16(火) 19:46:28.35ID:JHQMnpCL
つーか簡単だろ?

日付クラス。もしくは日付補助クラスに
2つの日付の差を年で返すメソッドを追加する

Personクラスには、誕生日とageプロパティをもたせ
ageプロパティは、誕生日と今日の日付の差を
さっきの年で返すメソッドを呼び出すだけにする


テストは日付クラスのメソッドはそのまま年計算のメソッドのテストを書けばいいし
Personクラスのテストは、単体テストの観点から日付クラスが
外部モジュールになるので年計算のテストは不要(すでにやってる)
年計算のメソッドを期待したとおりの引数で呼び出していることの確認と
返り値をそのまま戻しているかを確認すればいい


特定の年月日の年齢が知りたいなら、誕生日プロパティと特定の日付から
日付クラスの年計算メソッドを呼び出して差を計算するか、
適切な場所があるならそこにメソッドをおけばいい
0845デフォルトの名無しさん
垢版 |
2018/10/16(火) 19:47:46.46ID:JHQMnpCL
dateクラスに持たせるべきではないというのなら
年齢計算クラスに持たせればいいだけだな
0846デフォルトの名無しさん
垢版 |
2018/10/16(火) 19:47:59.81ID:GbK/byr7
>>841
すまん、ならdateクラスは撤回する
国にも依るとなると尚更personにも持たせたくないな
単にグローバル関数にするか、いっそそれ用のクラスツリーをでっち上げて後々多態できるようにするか、かなあ
0848デフォルトの名無しさん
垢版 |
2018/10/16(火) 19:49:01.40ID:JHQMnpCL
国によって年齢計算のアルゴリズムを変えたいというのなら
ストラテジーパターンの出番だなw
0849デフォルトの名無しさん
垢版 |
2018/10/16(火) 19:54:14.32ID:nQomBRvE
みんな賢いねぇ
0850デフォルトの名無しさん
垢版 |
2018/10/16(火) 20:36:04.05ID:83dvK2wh
俺やったらageプロパティやageオブジェクト作るんじゃなくて
ageクラス作ってpersonのデリゲートメソッドにageクラスオブジェクト返すものを作る。これで年齢とはそもそもなんぞや定義はの面倒な過程の話にも対応出来る
だが書く途中でゲッターですませやとキレだすと思う
■ このスレッドは過去ログ倉庫に格納されています

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