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
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クラスオブジェクト返すものを作る。これで年齢とはそもそもなんぞや定義はの面倒な過程の話にも対応出来る
だが書く途中でゲッターですませやとキレだすと思う
0851デフォルトの名無しさん
垢版 |
2018/10/16(火) 20:39:51.39ID:+sj1AQoJ
普通に考えたら person と基準日を表すオブジェクトから年齢を返す関数を作るってことになると思うんだが。
0852デフォルトの名無しさん
垢版 |
2018/10/16(火) 20:42:25.71ID:H029zngb
>>850
定義もわからんもの作んなカスwwww
0854デフォルトの名無しさん
垢版 |
2018/10/16(火) 22:05:40.03ID:t+SGPyRj
もうメンバー変数とメンバー関数が混在するクラスは作るな
関数しかないinterfaceで十分
関数が一つしかないならlambdaでいい
0856デフォルトの名無しさん
垢版 |
2018/10/16(火) 22:42:29.73ID:H029zngb
正直必要かどうかはわからない
ただおまえが欲しい
だめか?それだけじゃ?
0857デフォルトの名無しさん
垢版 |
2018/10/16(火) 22:45:36.90ID:VMcjBADQ
その低学歴知恵遅れが作ったメソッドは
うるう年考慮してなさそうで変なバグが入ってそうだわ

2000年10月20日生まれなら
普通にintで
(20181016-20001020)/1000
でしまいだからな
0858デフォルトの名無しさん
垢版 |
2018/10/16(火) 22:48:30.57ID:VMcjBADQ
そもそも常識的に
特殊なケースを除いて日付の引き算で
経過年数がかえってくるという発想はないからな

経過日数はあったとしてもな
0859デフォルトの名無しさん
垢版 |
2018/10/16(火) 22:52:46.85ID:VMcjBADQ
(20181016-20001020)/10000
こうだな
危ない。。。
0860デフォルトの名無しさん
垢版 |
2018/10/16(火) 22:54:43.61ID:VMcjBADQ
このとおり、
やっぱりな低学歴知恵遅れが
オブジェクト指向にふれるのは危険

オレぐらいのレベルがないとムリ
0861デフォルトの名無しさん
垢版 |
2018/10/16(火) 23:02:22.64ID:+0KL0EUx
俺の周りじゃあ
バカほど大喜びで使っているよ
0862デフォルトの名無しさん
垢版 |
2018/10/17(水) 08:20:36.48ID:K4tsdk4L
>>832
勝手に変わるか、と言う意味では、生年月日は不変だけど、年齢は変わるんでは?

>>833
なるほど。そもそもそれはプロパティとは言ってなかったんだな。
それはおっしゃるとおり、関数にすべきだと思う。
0863デフォルトの名無しさん
垢版 |
2018/10/17(水) 08:22:14.61ID:K4tsdk4L
>>857
年齢はその前日の満了を持って加算される、のルールで抜けるパターンがあるんじゃね?
半角さんは間抜けなの?
0865デフォルトの名無しさん
垢版 |
2018/10/17(水) 09:56:27.08ID:18gBK5Xa
大抵の場合、正しく理解せずに中途半端な実装してる案件にぶち当たって嫌な思いした奴がここに集うんだろ?
0866デフォルトの名無しさん
垢版 |
2018/10/17(水) 10:09:33.91ID:nljGc94P
実装レベルの議論してるやつと設計レベルの議論してるやつ
さらにもーちょい上から俯瞰して物を言ってるやつ
全部ごちゃ混ぜになってて面白いね
0867デフォルトの名無しさん
垢版 |
2018/10/17(水) 12:01:54.30ID:vk6wOayh
自分はプログラムの観点からだけで話してる
上にあった英語の奴もプログラムが主だったなぁ
設計は知らない
話題をスレで分けた方が良いのかねぇ?
0868デフォルトの名無しさん
垢版 |
2018/10/17(水) 12:20:31.30ID:BZlH8+Xm
設計レベルの話とかでとらんけどw
0869デフォルトの名無しさん
垢版 |
2018/10/17(水) 14:05:39.44ID:K4tsdk4L
やっぱ平年の3/1に、うるう年の2/29に生まれた人の年齢が狂うな。
しかしこういう知ったかぶりが、ひどいバグを生んで改修大変になる。
と言うか、これを保存時にやられるとデータ修正ものなので、場合によっては偉いさんが頭下げに行って、出世の道が遠のくパターン。
0870デフォルトの名無しさん
垢版 |
2018/10/17(水) 14:07:46.09ID:18gBK5Xa
設計って、機能ごとに必要な処理をリストアップしたら、そのまんまオブジェクト指向なんじゃね?
0871デフォルトの名無しさん
垢版 |
2018/10/17(水) 15:04:16.60ID:fcCyZegY
「誕生日の前日が終了する瞬間(すなわち誕生日をむかえる午前0時00分の直前)
に1歳を加えることになる」の部分の解釈には
前日に1日加えると解釈される場合と
当日に1日加えると解釈される場合の2種類がある
■ このスレッドは過去ログ倉庫に格納されています

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