ずるしてらくしてかれいに2げっとかしらかしら〜
3ゲットですぅ
for ( int cnt = 3; cnt < EOThread; cnt++ ) {
break;
} printf("%d", cnt);
printf("監督の背番号は%dです\n", cnt);
cnt は カントク の略ですか?
GNUみたいにスペースとタブを混在したりしなければ何でもいいなあ てゆーかインデントレベル2でタブ幅8はやめてくださいおながいします
プロジェクト内で統一されてるならそれで。
インデント幅とタブ幅は全く別問題だな。 タブ幅は一般的には幅8だが、これはエディタ依存で4に設定してる奴もいるだろう。 インデント幅はあくまでコーディングスタイル。 インデントにタブを使ったり、それどころかスペースと混ぜるなんてアホすぎる。 もっとマトモなエディタ使えよ、と。 俺はEmacs使ってるが・・・Emacs自体はGNUのウンココーディングスタイルで書かれてんだよなぁ。。
俺はタブを使ってインデントしてるんだが(ハードタブっていうのか?) こうしておけば各自見やすいタブ幅に設定しておけるしいいんじゃないかと思っている。
要は スペース派 == これが俺のインデント幅だ。従え。 タブ派 == インデント幅は各自好きにしろ。
あとは、さしずめ 混在派: 考えたこともない。 てとこか?
コピペするからスペースにしとこ派
VCのデフォルト派
こういう風に書く人なら、ハードもソフトも関係ないが int i; char c; struct dirent dirs; こういう風に書く奴が多いじゃん? int i; char c; struct dirent dirs; タブストップの設定が違うと int i; char c; struct dirent dirs;
タブとスペース使い分けたいんだけどね。
>>18 みたいなケースではスペース使って、
インデントにはタブ。
□をタブ、_ をスペースとして、↓みたいに。
□□func(a, b, c,
□□______d, e, f);
>>18 俺は
func() {
<TAB>int<SP><SP>i;
<TAB>char<SP>c;
}
みたいにする。
要するに、TABは必ず行頭から連続しているようにする。
言ってることは
>>19 と同じ罠
>>18 2番目の書き方は C の構造体のメンバ変数宣言とかでよく見るけど
最高に自己満足な気がする。
後で長い名前の変数作ることになったら
シコシコとスペースなりタブなり追加するんだろうか。
時間の無駄だからさっさとやめろと言いたい。
規約で強制されそうになったら頑として抵抗する。
へ? 普通そういうのってエディタのマクロでやるでしょ。 プログラマなんだからさ。
漏れもIDEで変数宣言の部分を範囲選択して整形コマンド一発かとオモタ。 でも簡単にリファクタリングできるからって意味もなくしまくっていいわけでもないだろ。 本質的でない変更がdiffに混ざったりすると混乱する (リファクタリングだけでちゃんとコミットしてればいいんだが)
>>24 最近のdiff/merge系のツールは賢いから、
そーゆー本質的でない変更は無視できるように設定できるだろ。
それよりも。ここで何故 リファクタリング という言葉が出てくるのかがわからない
さういうツールがろくに普及してないから インデントの設定とかが、議論のネタになるんだろw ソースだけ引き継ぐこともあるしなあ (完成品だけ引き継いで、バージョンアップしたこともあるがw)
おまいら、三項演算子をどう思うよ。
・アホは三項演算子使用禁止(そして、お前はアホだ) ・「( 論理式 ) ? 式1 : 式2」という書き方は禁止 全体を括弧でくくって、「( 論理式 ? 式1 : 式2 )」と書け
>>26 リファクタリングを、コードの整形レベルのことだと思ってるってこと
だろう。
>>28 普通に使うよ。使った方がコードが読みやすくなると思ったら迷わず使う。
よく言われるのは、「読みにくいから」かな・・・ まー使ったほうが綺麗に読みやすくなる場合もあると思うんだが、 アホに使用を許すと場をわきまえずバンバン使って、えらく読みにくくなる場合が多い。 どうせ構文砂糖なんだから、禁止しても害は無いので禁止しちまえ、という事らしい。
はいはい、そうですか。
ふたこと、言わせててくれ 三項演算子より条件演算子が正しい表現ではないのか 条件演算子はネスト禁止
なるほど、君が言いたい事はよーくわかったぞ。
HRESULT hr; FALSE | FAILED(hr = ...) | FAILED(hr = ...) | が30行ぐらい延々とつづくコードをみたことがある。 中で三項演算子もばっちり使ってた。 生暖かく見守ってたらやっぱりメンテで叫んでた。
うーむ、そうかそうか。
そう言えば、オープンソースのプロジェクトの規約ってどんなんなってんだ? 規約のリンク集みたいなサイトってある?
そんなもんあるかボケェ
GNUキモいな
>>42 gccとemacsの世話になりっぱなしだが、あれだけはイヤ。
あの規約のおかげで、コードが流用されたときに 出所がすぐ分かるとかw ねーか、キモいからか書き換えられる悪寒
TABな人です。 継続行は元の行より1レベル余計にインデントするだけで、 位置あわせは全くやりませんね。
>>28 ローカル変数を const にしたいときに使うので良く使う。
こういうときに匿名関数とか欲しくなる。
なんで人間がソースコードを整形するんだよ。 インデントなんか何だっていいんだよ、 チェックインする前に自動整形かければ済むことだ。 人様のコードを読む時も、自動整形かければ済むことだ。 まぁ、インデントがスペースだと文句を言う人は、 キーボードの→を押して、ぼーっと画面を眺めるような間抜けだろう。
そうかそうか、よーくわかったぞ。
>>50 なんで人間がソースコードを整形しないんだよ。
インデントって重要なんだよ、
チェックインする前には、必ず手作業で整形する習慣をつけるべき。
人様のコードを読む時に、自動整形するなんて言語道断。
まぁ、自動整形がいいんだと文句を言う人は、
世の中には例外というものがあって、自動整形することで
醜くなるソースコードがあることすら理解できない間抜けだろう。
なるほど、そうかそうか。
なんか、ソースが世代ごとに、違う整形ツールで整形を受けていって、 しまいにゃあ、いろんなところが崩壊して行きそう マイケルジャクソンみたいに
・使う整形ツールを規約で規定する ・ツール側の非互換な変更に備えて、バージョンまで指定する ・ツールを変更した場合、そのツールで全ソースを整形し直す くらいで解決できそう。
>>46 その例だと、こうする。TABの幅が変わってもずれない。(可変幅fontな奴はさすがにいないだろう)
<TAB>char *hoge = {"hoge", "piyo",
<TAB> "fuga"}; // TABのあとに14文字スペース。前の行のcharのc前までがTAB
まあ個人的なコードで他人関係ないならこう書くけど
<TAB>char *hoge = {
<TAB><TAB>"hoge",
<TAB><TAB>"piyo",
<TAB><TAB>"fuga",
<TAB>};
>>57 等幅フォントという前提自体が美しくない。
まぁ、>57の前者程度であれば空白が詰まろうとたいした問題ではないが。
駄菓子菓子、パラメータや型名の後を揃えたがるのはどうにもこうにも美しくない。
Ex.
sumType_t funcName(
int foo, /* この行にfooとbarをそろえるための空白を入れている */
const char * bar
)
{
プロポーショナルフォントなど使うスットコドッコイは逝ってしまえ的な
>>59 現にここに貼ってもプロポーショナルフォントで見る羽目になるわけで。
そういえばプロポーショナルなフォントでソースコード書かないね。 ハードウェア・ソフトウェアとも、十分プロポーショナルフォントで行ける環境はあるのに。 メールなんか、Outlook Expressやらのせいで、どちらかというと等幅の方が劣勢だよね。
フォント自体は等幅なのだが、 キーワードが太字になったり斜体になったりして 結局揃わない罠。
>>61 フォント変えられるエディタで好きに書けよ
double mat[9] = { 1.0, 10,0, 100.0, 125.0, 1.0, 12.4, 45.0, 1250.0, 25.0 }; こんな感じのを書くときとか、やっぱ都合が悪いわけで
そりゃそうだろ。アラビア語とか等幅の概念自体ありえないし
手持ちの英語で書かれてる本は、コード部分は等幅クーリエの模様だな。 アラビア語の書籍は持ってないので分からん。
よく考えたらソースコードにアラビア文字は使わないか。 日本語プログラミング言語が基本的にゲテモノ扱いなのと一緒で
プロポーショナルフォントでコーディングはないだろ。 むこうでもタイプライタ系の等幅フォントだよな。Courier NewとかConsolasとか。
Pascalのソースってプロポーショナルで印刷したりしない? Delphiは知らないけど
ストラウストラップの本のコードは確かプロポーショナルだったような
プロポーショナルだったら不要な宗教戦争はなかったかもなあ。
Pascal覚え立ての頃、+=の本をまねしてソースコードを pretty printすることはあったけど今はやらないなぁ。 だいたいソースコードを印刷すること自体まずやらん。
COBOLとかRPGとか、桁位置に意味がある言語だとプロポーショナルはつらいなw
>72 D&Eだっけ?すごく読みにくかった記憶が。
印刷されているものだと、実際のソースコードではなく、擬似コードっぽいものだと プロポーショナルで書かれていることもあるみたい。 今見たら、ソフトウェア博物誌とかそうなってた。
>>74 > だいたいソースコードを印刷すること自体まずやらん。
EclipseからわざわざソースをエクスポートしてDFで差分を表示して
印刷してレビューとかしてます。いやさせられてます。もうアホかと
>>67 タブじゃ全然無理
場所によって桁数がちがうだろ、よく見ろ
81 :
デフォルトの名無しさん :2007/03/12(月) 01:51:52
indent
手元にあるJavaクイックリファレンスでは プロポーショナルでびっしり印刷してある。 パッと視界に収まるのは良いけど。
ところで、<winnt.h>を見たら、その中で使われている構造体のメンバには さっぱりハンガリアン記法が使われていなかった。 このヘッダ自体は古くからあると思うんだけど、 そこでハンガリアンが使われていないということが意外だった。
Win 9xのチームとNTチームは元々別で、 ハンガリアンマンセーなのは9xのほう。 ってばっちゃが言ってた
ちなみに,NETではハンガリアン記法一切ない
NTカーネルモードのコードにもハンガリアン使われてないしね
カトラーがハンガリアンを嫌ってなかったっけ。
カーソル合わせりゃ型が出てくる統合環境で iHoge とか dwFoo とか書く意味はまるでないッ その変数の「意味」を頭に書き加えるのならやってもいいッ
デイヴ・カトチャン
本来のハンガリアン記法は型名略記なんかじゃなかったんだよな。
ハンガリアンを積極的に使うつもりはないけど、 HWND hWnd; とか書いちゃってるなあ。 HWND windowHandle; でいいはずだが。
ハンドルのhはむしろアプリケーションハンガリアンに近いものだと俺は思っている。 (やや苦しいかもしれないが)例えばC#なんかだとみんなIntPtrになるからハンドルにhを付けるのも生きてくる。 C/C++のtypedefは型名にアプリケーションハンガリアンを適用するためにも使えるという見方もできる。 (それが行き過ぎて型名とプレフィックスを結び付けるシステムハンガリアンになってしまったのかもしれないが) そういう訳もあって俺はウィンドウハンドルの変数名・プレフィックスをhWndとするのではなく、hwndとしている。 HANDLE hHoge = hwndHoge;なんて有り得ない。
なにかとATL::CWindow使ってる俺は wnd〜 もしくは 〜Window
GUI部品に btnHoge や tblFuga はありだと思う。 だってボタンやテーブルなんだし。
hogeButton とか fugaTable とか、略さず書くべきだと思うんだ。 妙な略語は読みにくい。 今時の環境なら補完くらいしてくれるから、長くてもtypoは起きにくいし。 へたすると、短くて補完効きづらい名前のがtypoしやすいくらい。 それに、 button とか table とかは接頭辞じゃなくて接尾辞にすべきだと思う。 型より意味のが重要なんだから。
できればcamel caseはやめてほしい… などと言い合いの軸をもう一つ増やしてカオスに追い込んでみようかな。
camel caseやめると語のつなぎは_かえ?
俺は変数は_繋ぎの小文字で関数はCamelにしてる。 変数に大文字が混入するのは何となく嫌だ。
>>97 頭に持ってくるか尻に持ってくるかは、
どっちの意味を重視するか、どっちから探したいかによるかと。
俺の頭の中ではボタンは型ではなくて、単にボタン。
hoge するものであること以上に
画面上のボタンであることをイメージするので
(hoge という意味もボタンという意味も持つ。型はない。)
頭に持ってきたいんです。
なんだけど、hogeButton の方が自然な名称だとは思う。
まぁ規約に従いますよ。
ボタン型であるquit(型ハンガリアンだが)じゃなくて quitボタンという画面部品だから、付けるならquitButtonだなー。 quitButtonで呼ぶ処理ルーティンの名前はquitかもしれぬ。
quitButton を見て「変数名に型情報入れるなボケ」 とか言ってくるやつがたまに居るんだが どうやって対処したらいいんだろ。 型じゃねーよと言っても分かってもらえない。
>>103 ボタン型より抽象的な型(コンポーネントとかウィジェットとか)で
保持してやればいいんじゃね?名前はそのまんまで。
で、本当にボタンとして使うときには毎回キャスト。
一回やってみせて、できあがったアフォコード見せてやればきっと
納得してくれるよ。
アフォをもってアフォを制す・・・か
逆に次からもそうしろってなったら嫌だなw
C言語だと、 a += 2; { 懿。疂nt tmp = a; 懿。畭 = b; 懿。畸 = tmp; } みたいに{ }を使うこともあると思うけど、これに if else をつけると、 if (a > 0) 懿。畭 += 2; else 懿。痣 懿。癧疂nt tmp = a; 懿。癧畭 = b; 懿。癧畸 = tmp; 懿。痾 のように、一行コードと{ }のブロックが同じインデントになってるから、 GNUのスタイルは一応理にかなってはいるなと思っただけ。
C言語だと、 a += 2; { □int tmp = a; □a = b; □b = tmp; } みたいに{ }を使うこともあると思うけど、これに if else をつけると、 if (a > 0) □a += 2; else □{ □□int tmp = a; □□a = b; □□b = tmp; □} のように、一行コードと{ }のブロックが同じインデントになってるから、 GNUのスタイルは一応理にかなってはいるなと思っただけ。 #化けたのでもう一度書きます。すんません。。。
& n b s p ;をスペース入れずに使いましょう
>>108 GNUの{}がキモイと言っている奴らは
そういう理屈を理解した上でなおキモイと言っているんだと思われ
何しろ「キモイ」なんだから理屈じゃないわな
>>110 オレは { } を使わない if がそもそもキモイと思う。(
>>108 の a += 2; の部分 )
まあ確かに理屈どうこうじゃねーな。 とにかく気持ち悪い。
115 :
108 :2007/03/18(日) 02:14:49
>>112 見ていて一番自然なのは K&R のスタイルだとは思うけど、
それでも、{ } を使わない if は普通に出てくるよ。
>>115 自分では単文の時も必ず{}で括るようにしているが、
そうでないソースがあったとしてもキモいとまでは思わないな。
if (hoge) a = 1; else { int b; a = 1; b = 2; } 1行コードと {} のインデントを同じにしなきゃならん理由がわからん ifとelseの中身が同じインデントレベルの方が見て把握しやすい GNUはやっぱキモイわ リーナスたんが言うようにGNUのウンココーディングスタイルなんて燃やすべきだ!
別にどっちでも大差ないでしょ 俺様wayに頑なに固執するのは俺的には精神分析の対象だと思う。 どっか幼児性が切断されてないところがあるんじゃないの? 気色悪い、という感情はコードのお作法に対してより、 むしろそういう自分自身をこそ向けられるべきだね。
とはいえ、人間はパターン認識の動物だから、 異なるパターンのコードを行ったり来たりするのは疲れることは確か。 だとしたらフリースタイルというcの思想がそもそも間違ってるのかもね。 まあ、自由というドグマに囚われた不自由なアメリカ人が作ったものだからな。
単文とか複文という概念が無いModula2最強ってことでw
GNUのスタイルがキモいと思ってる人間は少くないんだから
コミッターや開発者の間で民主的に多数決でもとって GNU v2 のスタイルでも
決めてくれればいいものを。
一部の変人がコーディングスタイルを決めて、それがデファクトスタンダードになって
しまってる現状に疑問を投げかけてもいいんじゃない?
>>118 みたいに人格攻撃しかしないバカには理解できないだろうけど
>>118 になにがしか反応せずにはいられないやつがこれだけいるとはw
幼児性って分断させるものなん?
>>121 「デファクトスタンダード」の意味調べて来い。
>>130 >>121 は、FLOSSなどと呼ばれるソフトウェアはLinuxカーネルを除いて
みなGNUスタイルで書かれてるとでも思っているのではないだろうか。
>128 俺は一瞬「幼児を分断」と読んで萎えた
そんなつまんないレスすると。負けずに 正しくは「幼児性の払拭」だね なんつう、つまんないレスを(ry
C++使いです 関数名、変数名の大文字小文字でずっと悩んでいますが、 スタイルはJavaやMSDNでいいと思っています でも、STLやBoostを使うと、バランス悪くなりませんか?
それがC++標準のスタイル。気にしないのがベスト。 必要以上の一貫性は無意味だ。
>>101 それはいつも悩んでます。俺はVBでcmdOkとかcmdCancelみたいなのに
慣らされてきたから、C#になったときにbuttonOkとかbuttonCancelとか
やってみたんだけど、確かに探しやすいんだがなんか気持ち悪い。
次のプロジェクトではokButton、cancelButton式にしたんだけど、やっぱり
探しづらい。どうしても「UI要素の分類」をキーボードから打ったあとで
候補から↑↓で選ぶ方が探しやすいと思うのだ。
そうして小さなプロジェクトを作るごとにあーだこーだ悩んだ末、
今ではプロジェクトごとにばらばらだ。それが一番ダメなんだってw
プロジェクトごとにばらばらなのは許容範囲でしょ。 ダメなのはプロジェクト内で統一されてない時。
>136 _をofと考えて、button of ok → button_ok
/** * ←このアスタリスクがめんどい */
140 :
デフォルトの名無しさん :2007/05/09(水) 03:13:07
C/C++/Java の複数行コメントのスタイルについて。 /* * ←このアスタリスクがめんどい */ はじめに書くときにも面倒だし、後でコメント内のインデントを上げ下げ するときにも激しくウザイ。そしてこの面倒さに対するメリットがよくわからない。 いっこだけ検索して見つけたのが、その行がコメントであることを行自身に 明示させる働きがあるとのこと。だけどそんなのエディタで開けば 色分けしてくれるし、そうじゃなくてもコメントとコードの区別は目で見れば 簡単に判別できる。機械的に判別させるためであれば、行頭アスタリスクで 始まるコードも書けてしまうので結局曖昧なままだし。 なんでこのスタイルがこんなに普及してるのか、知ってる人がいたら教えて欲しい。
見た目がどうこうとかもっともらしい理由が言われ続けているから、ではなかろうか。
モノクロの世界だと区別が分かりやすいってのはあるかもね。 いちいち打つのは面倒だからやりたくないね。 エディタが勝手に埋めてくれるから埋めとくかって感じだけど。
>>139 それがそんなにめんどいなら、そのアスタリスクを付加するフィルタを簡単に作れるようになるべきかと。
固定文字列対応のことを考えるとめんどいけど
>>142 そのエディタ、コメントの中のインデント調整してもアスタリスクの位置だけ
保持してくれたりする?
んなもん頭に*つけたり外したりするのなんざエディタの仕事だろうが。 プログラマなんだからそれくらいエディタにやらせろよ。
GNUは極度の後方互換とストールマソの趣味であんな規則になってるんでしょ ところで単語の区切りはどうしてる? do_somethingで単語を区切る方が好きだけどC++やJavaも使うから泣く泣くdoSomethingみたいに大文字で区切ってる
MFC で C++ を覚えた俺から見ると DoSomething が一番自然に見えるw C# と Java やり始めてようやく doSomething 式にしたけどまだ違和感があるな
俺てきとうだなぁそのへん。 とりあえず周りに合わせる感じ。 C++でソロだとdo_something系だな、今は。
>>148 C#はDoSomethingだろ
マイクロソフト様のガイドラインに書いてある。
do.somethingみたいな具合に doやsomethingそのものも柔軟に定義できてそれらの直行性を使って 複合的な機能が実装できればいいのに
日本語おk
放っておけ奴は「直行性」と言いたいだけだ 直交性に読み替えてみてもさっぱり意味が(ry ・・・もしかしてニモニック?
>>150 マジすか
明日から堂々と DoSomething って書くわ、むろん Java でも
>>154 Javaでのメソッド名、変数名についてはdoSomethingでたのむにょろ。
変数名とメソッド名の見た目が同じなのが嫌という理由で 変数名は小文字アンダースコア区切り、メソッド名はCamelな俺。
名前の途中に大文字だけの単語が出てくると 命名しててなんか気持ち悪くなるんだよね。
>>146 変数名と関数名は全部小文字で単語間をアンダースコアで区切る。
クラス名はキャメルケースを使う。
という風に使い分けてる。
Javaをアンダーバーで切ると標準ライブラリで見づらくなるじゃない?
クラス名の先頭は大文字にしとけ
クラス・関数・変数・定数・etcの区別に拘っている方に聞きたい。 関数ポインタとかファンクタ、デリゲート、const変数等はどう名付けてます?
使用するライブラリに合わせるかなぁ。
>>161 デリゲートって悩むよねー
MS様のガイドラインではイベントハンドラ以外のは
〜Callbackにしろって書いてあったと思うけど、
明らかに守られてないし。(MethodInvokerとか)
あんまし関係ないけどWin32APIの定数はできるだけ
constの変わりにenum使うようにしてる。
変数 => 全部小文字/アンスコ メソッド => 先頭小文字/キャメル クラス => 先頭大文字/キャメル 定数 => 全部大文字/アンスコ かな。
>>154 publicな名前はDoSomethingで、
privateな名前はdoSomethingと覚えておけばいい
privateメソッドはどう名前をつけようが窯湾だろ。
c++だとバッティングするリスクがあるのでちょっとは気にした方がいい。
そのバッティングするリスクとやらをどうぞ
ttp://www.mozilla-japan.org/hacking/portable-cpp.html > C++ 標準規格 17.4.3.1.2 節 グローバル名 [lib.global.names] 第1パラグラフによると:
>
> 名前と関数シグネチャのある特定の組は、実装によって常に予約されています:
> 二重のアンダースコア(__)が含まれる名前、または後ろに大文字 (2.11) が付くアンダースコアで始まる名前は、
> ある目的のために実装によって予約されています。
> アンダースコアで始まる名前は、グローバルな名前空間で使う名前として実装によって予約されています。
169 :
デフォルトの名無しさん :2007/05/16(水) 08:11:48
doxygen で @param に付く in, out って、つけたほうがいいんでしょうか? ほとんど [in] だし、ポインタに const ついてなければ [out] または [in,out] なんで、 あんまり手動でつけて回るメリットが無いような気がしてます。
>>169 私のところでは、過去との互換性でconstついてないポインタの時にはつけてる。
クラスというか、抽象的に状態を保持してるオブジェクトを 渡すときは in も out も何かしっくりこないしねぇ。出したり入れたり じゃなくて状態を変更するかどうかが重要って感じ?
通常それをピストンというのでは?
ほしゆ
ケースセンシティブをなくせばこんな宗教戦争は解決するんじゃない?
>>174 自動車をなくせば交通事故は無くなるんじゃない?
>>175 いいえ、自動車以外の交通事故は残ります。
→ケース問題を除く宗教戦争は残ります。
BASICって確か大文字小文字区別しないけど、 あの言語ってケース問題に関する宗教戦争ってないのか?
8bit時代のBASICならいざしらず、VisualBaiscとか今時のBASIC使ってるヤツで 「大文字小文字同一視だぜ」とか言ってるやつはみたことないな。 普通に大文字小文字区別して「どう書こう?」ってやってる。
Delphiが「大文字小文字同一視だぜ」なんだけど、 書籍やIT系サイトのチュートリアルっぽいコードで、たまに無茶苦茶なのを見かける。 一般向けに晒すコードなら、プロパティ名とかメソッド名はオンラインヘルプに記述されているとおりに書け。 # Delphiのヘルプは酷いから、そもそもオンラインヘルプで記述が統一されていないってのもあるが。
MSDN見習わせたらエラー処理はしないしファイル番号は固定だし……
ってのは兎も角。
>>178 VisualBasicは大文字小文字を区別できるんですか?
例えばdim aa as integer, AA as integer, Aa as integerみたいに?
私ゃ保存はされるけど区別はできないと思っていたのだが。
181 :
178 :2007/05/21(月) 15:01:39
>>180 いや、区別しない。
>>178 で言いたかったのは
「区別されないからAbcDefメソッドをABCDEFで呼ぶぜ」なんてやつはおらず、
VBでも「『AbcDef』がいいか『abcDef』がいいか(大文字小文字を意識して)どう書こう?」って
やってる、ってこと。
書き方悪かったかも。ごめん。
でも自動車を無くせば自動車事故は起きなくなるね #こういう考え方はいかん #エロサイトを封じれば性犯罪が減ると思ってやがる
>>182 コメントへの野暮なレスですまんが、
もとの「自動車を無くせば自動車事故は起きなくなる」に対応する
のは「エロサイトをなくせばエロサイトへの接続が無くなる」では。
# 縦読みを仕込みたかったが出来なかった。
エロサイトを封じたら、性犯罪は増えるんじゃないの?
>>183 エロサイトを封じればエロサイトの広告、迷惑メールなどが減る。
→でもその他の広告などは残る。
186 :
175 :2007/05/23(水) 01:40:16
大文字小文字の区別をつけるか否かは、言語設計者が決めることだから、 その言語を使用する側が制御できることではないし、どうこう言うべきことでもない と言いたかったのですが。
最近はCOMとか.NETとかスクリプティングとか言語設計者の都合だけでは 決められない要素も出てきた
COMは最近ではないと思うけど、まあそうだね。
機械語
そういえばスペースだけでコーディングする言語あったよね あれなら宗教戦争はなくなる
ホワイトスペルマだっけ?
しばらく開発から離れた仕事をしていたうちにハンガリアンはあまり使われなくなったみたいですが、どういった理由でですか? カーソルをあわせれば型が出るからですか? 自分はカーソルあわせるのが面倒なのでハンガリアンで書いてますが・・・
>>192 templateをゴリゴリつかったプログラミングなんかが流行ったこととかが関係してると思う。
ハンガリアンだと型を変えたときに名前まで変えなきゃならんしね。
↑これは型に対するハンガリアンのことであって、意味に対するハンガリアンは
いまでもそこそこ使われてると思うけど。
変数のスコープがやたらでかくなってないか、 関数でかすぎるせいでそうなってないか、 一回見直したほうが良い。
悪しきシステムハンガリアンが消えて 本来のアプリケーションハンガリアンを用いる人が増えただけ
ハンガリーってどこらへん?
X系はdoSomething、GNU系はdo_something ディストリをメンテしているオレの戦いは今日もつづく
無駄に探す労力を割かす上につまんねぇ… なんという糞レス…
今までこう書いてたけど
変数 => 全部小文字/アンスコ
メソッド => 先頭大文字/キャメル
クラス => 先頭大文字/キャメル
定数 => 全部大文字/アンスコ
>>163 さんと同じにした方がみやすいんじゃん
っておもた
でも先頭が小文字のキャメルは不自然に感じてしまう
C#だけど結局 プライベートフィールド・ローカル変数 :ローワーキャメル 名前空間・クラス・関数・プロパティ・定数 :アッパーキャメル に落ち着いた。 フィールドにアクセスするときは必ずthis付けるようにしてるから ローカル変数と混同することはないはず。 今MSDNのガイドライン読んだらプライベートメンバの 名前付けに関してはなんでもいいみたいだな。
>>202 構造体・クラス・列挙体にはリーディングタグつけないやっぱり?
C#だとやってる人ほとんどいないなどういうわけか。
enumはともかく、クラスと構造体の違いは勘違いしてると致命的になる場合が
あるから、つけた方がぜったいコード読みやすいと俺は思うんだけど。
MS的にNGな気がする。
205 :
デフォルトの名無しさん :2007/06/29(金) 01:18:09
>>163 氏の命名法で
変換テーブル的に使う変数(例えば数値→文字へに使うようなmap型の変数)や
関数オブジェクトのインスタンスなら関数と同じような命名法である
>先頭小文字/キャメル
を適用したいのです
こういう類の変数で初期化時に設定してあとは殆ど変更しなかったり、
初期化部分以外での扱い方が関数的(mapの例だとmap[x]でxに対応する値の取得に使われる)たりで
メソッドとみなしてメソッドに対する命名法を適用しても問題ない気がするんですがどうでしょう?
それでも変数である以上変数に対するルールを出来る限り使用するべきでしょうか?
>>203 C# は結局、VS のインテリセンスに頼ること前提だから、
クラスと構造体の勘違いは気にしなくてもいいのかも。
P/Invoke以外で構造体作ったこと無いなー。
>201 Javaだと先頭小文字のキャメルってよく使うよ。 何せ標準ライブラリがそうなってるからな。 M$は先頭大文字キャメルLoveみたいだが。
.NETは、 名前空間名、型名、パブリックメンバ名はPascalCase、 関数の引数名はcamelCase
正直Camelで区別するのって、ハンガリアンと同じモノを感じるのは漏れだけですか。
ハンガリアンはハンガリアンでもアプリケーションハンガリアンは全然おkだよ getXXXとかのgetのようなものも役目としてはこれに近いから同じように感じるのも無理はない
C#でLogというクラスを作ったわけですよ。で、ログの種別を 区別するための列挙型をLog.Typeと命名したんですね。 .NETのライブラリでもアッパーキャメル規約になってるっぽいですから。 で、メンバ変数としてType Log.typeを定義したのです。ここまでは 分かりますね。さらにLog.typeを外部から直にアクセスして欲しくないので typeにアクセスするプロパティを定義すると。MS式の記法だと、やっぱり Log.Typeが妥当かな? 型 'Log' は 'Type' の定義を既に含んでいます。
>>212 キャメル云々はそれでよいと思う。
名前が重複する件は、列挙型はTypeでよくて、プロパティの方は「○○のためのType」という
○○の部分をうまく補ってあげればいいんじゃないかな。
214 :
212 :2007/08/17(金) 03:18:25
「○○のためのType」がこの場合、本当に「ログのためのType」としか 表現のしようがないのが辛いです。 列挙型はLog.Typeで、プロパティはLog.LogType…うーむ。 余談ですが、列挙型の識別子を“TYPE”と全部大文字表記 (長い場合はアンダースコア区切り)にすることも考えました。 しかしその方法でも内部クラスとかの命名になるとお手上げ…。
TypeIdとかTypeNoとか。
216 :
デフォルトの名無しさん :2007/08/24(金) 04:14:41
C++だけど、こんな感じで関数名と変数名がバッティングするときどうします? class Ore { public: bool isNeet() const { return isNeet; } // if (ore.isNeet()) { ... } とか呼びたい private: bool isNeet; }; 1. こういうの嫌だから関数を大文字で始めてるYO(isNeet()をIsNeet()に) 2. こういうの嫌だから変数にプリフィックスなどをつけてるYO(isNeetをm_isNeetやisNeet_に) 3. 変数名を変えちゃうYO(isNeetをneetとか……形容詞ならともかく名詞だと変な気が。 なんかもっといいネーミングとかありますかね) なんかJavaだと↓で普通に通っちゃうんだけど。理屈はわかりませんが。 class Ore { public boolean isNeet() { return isNeet; } private boolean isNeet; } 関数名が小文字で始まるほうがコードが柔和な気がするのでC++でもそうしたいんですが、 (メイヤーズ先生も小文字で始めてるし) どうもここがちょっと引っかかって。
>>216 isNeet = false とかがキモイのもあって、 neetFlag とかにしちゃうかな。
m_neet もアリだな。
>>216 メソッド名を大事にしたいならフィールド名にちょっと引込んでもらうしかないのでは。
自分ならサフィックスにアンダーバーつける。
>>217 「isNeetを内部で保持するのはneetFlag」みたいなのって、頭使うの面倒じゃない?
まれにはそういう置きかえがピッタリいくこともあるけど、ほとんどの場合は
機械的に「プレフィックスつけてるっすー」とかの方が、余計なことに気を回す必要がなくて楽だと思う。
_* m_* がいいよ。 メンバ変数を他の変数と区別できるようにするのは、 CodeCompleteでも薦められてるようなよくやるパターンです
メンバ変数はname_にしてる。
>219 _FollowedByUppercaseLetterはコンパイラ&ライブラリ実装者用の予約語なので、 _nameも避けといた方が無難。 #double__underscoreもね
前にアンダーバー置くのはイクナイね。
某所で、初心者にえらそうに教えてるやつが、Cなのに構造体のメンバにm_をつけてた。 意味をわかってつけてるのか。
>>219 _name をつけるほど自信家じゃない
grepしたときやたらと似たようなのが引っかかりそうだし
それにエディタの行位置表示を下線にしてあるから、見えなくなる
>それにエディタの行位置表示を下線にしてあるから、見えなくなる これが理由なら、阿呆だ。
>>223 member の m なら C の構造体でも間違いではないだろ。
>>221 たぶんそれ、グローバルな名前がそうなだけ
予約識別子だから、マクロ名を含めて、ソースコード中に出現してはならんよ。
229 :
227 :2007/08/25(土) 11:29:28
すまん
>>221 は、_の後に大文字が来るのが最もマズいって言ってんのか
外からしか扱わないメンバに m_ とかつける必要は無いだろ。 struct Point { int m_x; int m_y }; Point p0 = { 0, 0 }; Point p1; p1.m_x = p0.m_x + 1; とか無意味。 scope の間違えようがない。
class Hoge { private: struct { int x; int y; } m; }
232 :
227 :2007/08/26(日) 00:16:02
>231 コレ継承先から継承元の変数見るのが面倒では… あー、もしや変数は全部privateにしろって事?
>>234 >あー、もしや変数は全部privateにしろって事?
当たり前じゃん。
>>234 structなしでint m_x;とか書いたのに比べて、なにか不便になることってあるの?
2〜3行増える。 素直にint x_, y_;にしとけばタイプ量も減る。
231のmをポインタにした感じのコードなら書いたことある。 例外にも強いしコピー・交換も楽で速いしなんて思っていたら、 どうみても劣化pimplです、本当にありがとうございましたというオチ。
>>237 メンバ数が多いと、逆にタイプ数は減らないか?w
アフォな質問ですまん。 >231の例でx,yの初期化ってどうやって書けば良い?
>>241 普通にコンストラクタの初期化部で書けばよろしいかと。
243 :
241 :2007/09/05(水) 00:12:31
>242 サンプルコードを書いて貰えませんか? 少なくとも漏れの知ってる書き方をみる限りでは、 >231の方法はやっぱダメだとしか思えませぬ。
structが無名だから初期化できないね。ま、コンストラクタで代入するってことで。 -- class Hoge { struct { int x; int y; } m; public: Hoge() {m.x = 0; m.y = 0;} Hoge(int x, int y) {m.x = x; m.y = y;} };
x,yがconstか参照で、かつコンストラクタの引数経由で 外部から初期値渡したい場合は? それ考えると>231はやっぱ使い物にならん。
struct に名前を付けてコンストラクタ書けばいいだけの話じゃないの?
最早>231はどうでもいいがw >x,yがconstか参照で、かつコンストラクタの引数経由で >外部から初期値渡したい場合は? 条件後出ししていいなら、構造体に名前つけさせてくれ。
>246,247 structに名前付けるのはいいけど、 通常1回書けばすむはずの処理を、2回書かなきゃダメだよね? そうじゃないスマートな書き方を知っているなら是非ご教授を。
>>248 2回って、何で? Hoge は InnerHoge に丸投げするだけでしょ。
>>249 Hogeのコンストラクタとその内部構造体のコンストラクタで
2回初期化を書かなければいけない(そしてそれがスマートでない)
と248は言っているのだろう。
あーの、Windowsでアンダースコア区切りの命名規則を採用している方に質問なのですが、 皆さんはWinMainの引数とかAPIのコールバック関数にもアンダースコア区切りで命名しますか? それともWinAPIに関連する変数は例外的にハンガリアン+CamelCaseで命名しますか? 当方、先週Windows畑に飛ばされたばかりのへっぽこPGなんですが、 どうにも気になって気になって。。。
Gtk+なんかだとAPIそのもの以外は徹底的にアンダースコア区切りで命名してるな
253 :
1/2 :2007/10/05(金) 00:49:37
なんか、コーディング規約で this を返すのは駄目っていうのをどっかで読んだんだけど こういうのはどうなの? (サンプルソースの意図は、oldTest() の if 文を無くして test() のようにシンプルにすること) public class Test { private static void oldTest(String[] params){ for (int i = 0; i < params.length; i ++) { if (0 < i) { System.out.print("," + params[i]); } else { System.out.print(params[i]); } } } private static void test(String[] params){ Printer printer = FirstPrinter.instance; for (String param : params) { printer.print(param); printer = printer.nextPrinter(); } } public static void main(String[] argv){ test(argv); } }
254 :
2/2 :2007/10/05(金) 00:50:41
abstract class Printer { abstract void print(String param); abstract Printer nextPrinter(); } class FirstPrinter extends Printer { static final FirstPrinter instance = new FirstPrinter(); void print(String param){ System.out.print(param); } Printer nextPrinter(){ return SecondPrinter.instance; } } class SecondPrinter extends Printer { static final SecondPrinter instance = new SecondPrinter(); void print(String param){ System.out.print("," + param); } Printer nextPrinter(){ return this; } }
>>253 コード読んでないけど、駄目って言う理由がないんならどうでもいいんじゃね?
メソッドチェーンするのに便利だしthisを返しておいた方がいいと思ったんだけど、 駄目って言う理由はなんなんだろう。
>>256 ちょっとよくわからないで言うけど
this を返してもらった奴がこれを使うときにthisの実体がなくなっちゃてたりするケースってない?
>>257 だって呼び出している側がインスタンス保持しているのに、
なくなっているってことが通常ある?
>>257 コード見る限り Java だから、それはありえない。
入出力関係のオブジェクトだと閉じてる可能性はあるね。
まじわからないで言う、ごめん インスタンスを持っているならthisを返す意味はある? 汎化という目的で独立性を高めるために他の処理でこれを使うことを考慮したら インスタンスが失われることを考えてthisを返してはいけないとか
if を使ってる処理のほうが、「何をしているか」がよくわかる
>>261 instance.foo().bar().baz()
とかやりたいってことない? これを指してメソッドチェーンといったんだけど。
operator overloading なんかだと this を返さないと成り立たないけどねw まあ、java にはないから関係ないけど
副作用がある場合はthisを返さないってポリシーはあるな。
>>253 シンプルどころか複雑怪奇になってる。
さらにメモリ使用量も増えてるし、速度も遅くなっていそう。
そして、return this;よりはreturn SecondPrinter.instance;の方がいいだろう。
最悪なのは、親クラスのクラス変数を子クラスで隠蔽しているところだな。
個人的に思ったのは、
「this を返すAPI を作るな」っていうコーディング規約は、
「メソッドチェーンを前提にした API を作るな」っていうのが本来の意図であって、
そうでなければオーケーなんじゃないかと。
>>266 今回はサンプルがはじめからシンプルだったために、結果的に複雑怪奇になってしまったわけで、
実際にはトレードオフで適用すればいいのだと思います。
>最悪なのは、親クラスのクラス変数を子クラスで隠蔽しているところだな。
親クラスで定義しているのは抽象メソッドだけで (つまり実質的にインタフェースといえる)、
クラス変数は存在しないはずなのですが・・・
>return this;よりはreturn SecondPrinter.instance;の方がいいだろう。
あー。確かに。言われてみれば。
ただ、今回は Printer をシングルトンで実装できたけど、
例えば任意のセパレータの文字を指定して CSV ファイルを構築できるように
Printer を改造したような場合は、各インスタンスが状態を持つようになるので
this を返すような実装になると思う。
まあ、この場合でも Printer をイミュータブルになるように設計して
Flyweight の getter メソッドを活用して this を返さないような仕組みにすることは出来るけど
そこまでやると冗長になる気がする。
private: bool isHoge_; だけでなく、 private: void doHoge_(); とか、 template<class Hoge_> のように準ローカルな名前全てにアンダーバーを付けたくてウズウズしてしまうのですが、 そのようなコーディング規約が見付かりません。 常識的にあまり推奨されないのでしょうか?
>>270 発端は、templateのタイプ名が外部の通常のクラス名と衝突してしまったため、
冗長にせざるを得ない場面があったからです。
ならばメンバ変数に習い、「末尾にアンダーバー」イコール「スコープ限定」にしてしまえば、
衝突も避けられるし、読む時にも迷子になり難いのではないかな・・・と。
>>271 そんな局所的な理由で規約になるわけないんじゃないの?
後ろにアンダーバーなんて始めて見たな。 前ならそうしてる人結構いるよ。
前につけるとすぐ予約名になるまたは予約名とまぎらわしいから、やめといたほうがいい。
>>271 つまりボキャブラリが貧弱なのを _ でごまかそうということですね
英語の辞書を買ったらどうでしょう
冗長といっても、いくら長くてもいいと思う
あとで別の人間が解析するときに、
grepをかけたら似た様なのがゾロゾロって
猛烈に格好悪い
276 :
227 :2007/12/15(土) 07:45:38
>>274 これっていつから言われてるの?
昔は_ 前だったのに・・・
>>271 それってローカル側優先で処理されるよね?
TXxxx
とかにするってのもどうかね
>>276 > これっていつから言われてるの?
「言われてる」ってのが何のことかわからないけど、予約名の規定自体は
知ってる範囲では ISO C++98, C99 とかで決められてる。たぶんそれより前の
C89 からそんなに変わってないと思うから、少なくとも 10 年以上前から使っちゃ
マズイってことにはなってたはず。
>>276 MS-DOS の初期のころから内部の実装で使われていた気がする
>>279 確かに、C の関数の場合は後ろに _ をつけると()と離れて絵的に悪くないかも知れないけど
いまひとつ _ を前後に使う意味がわからないな
_ があることでなにかを示すようには見えないな
もっと、適切な方法があるならそれを選んだほうがいいように思う
見てわかるような名称にするように文になっていたっていいと思う
昔の関数名なんか変なのあるよな
creat() なんて何を考えてるんだかw
'e' 一文字を省く理由がわからない
281 :
227 :2007/12/15(土) 12:39:05
>>277-278 ごめ。
_ は前に普通に付ける時代があったんだけど(本とかで載っていた)
最近後ろに付ける勢力が急拡大している感じ。
いつからだろうと。
>>281 前につけることの問題を知らずに本を書いちゃうようなアホが淘汰されたんだろう。
いつからってこともないと思うぜ。
>271 利点、欠点を考えて判断すりゃいいんじゃない? 利点:ローカルスコープの関数・変数が一目でわかる 欠点:メンバー変数とメンバー関数のバッティングが発生する可能性がある(C++の場合) -->別の命名規則で回避する必要あり ぐらいかね? ローカルスコープなんだし好きにすれば?という気もするけど。
>>282 _ 前に付けて問題になったことなど一度たりともないけどな。
メンバ変数なんてローカルだし。
__descspecとかのキーワードなんて __ だしな
>>280 creat()については名付け親がそうつけてしまったことを深く恥じているのだから、
もうそっとしておいてあげたらどうだw
釣りか本気か微妙な流れだw
>>284 __declspecはむしろ正しい使い方。
処理系予約の識別子なのだから。
>>287 ?
いや、その通りだけど、
>>284 の趣旨は、「そういうのは"__"だから、"_"を前につけても問題が起こったことはない」でしょ。
ナイシフォロー
>>280 歴史的なもの
識別子に5文字しか使えなかったシステムで付けられた名前を引きずってるだけ
>>284 一度もないのは分かるけど、
規格で「予約」と明記されているものをあえて使う理由が分からん。
ローカル名については「マナー」程度なのかな?
他の言語だと「予約」だったりするんだろうか。
2重の__ は予約かも知れないが、 グローバルの_ はstdio.hとかのライブラリと被るので ~~~~~~~~~~~~~~~ 注意ってことじゃなかったかって気がするんだが。 手元に資料がないから確認は取ってないが
あ、一つ思い出した。 そういやBUFSIZ ってシンボル使えないよなw
>>292 どっちも「予約」だよ。識別子の利用範囲が違うだけ。区別するのがメンドイから
自分とこで作るルールに書くときは一括でダメってことにするのが簡単。
>>295 うーーー。意味わかんない;
ごめんオレ馬鹿すぎ。エロイ人教えて。
297 :
296 :2007/12/16(日) 13:58:19
あ、泣くほど読んだらわかった;
>>296 >281-282 にある
> _ は前に普通に付ける時代があった
> 前につけることの問題を知らずに本を書いちゃうようなアホ
の例じゃね?
まぁ明日ARMでも読んでみるわ。 メンバ変数名は、 グローバルなネームスペースを汚してるわけじゃないしね
っ >168
なぜ予約語とぶつかる可能性のあることをしようとするのか いまひとつわからない たしかに、かっこいいかもしれないけど _や__が予約語に多いのだから、他人が見たら、 これらは予約語としてみられる可能性があるということでしょ? できるだけ、必然的であるべきだと思うのだけど でないと後で見てわからない気がするんだけどな 名称を考えるのがめんどくさいだけに思えるのは、オレが世間知らずだから?
C/C++ の入門書や入門サイトがそういうインクルードガードを書いてたり。 そういうのを見て覚えた奴が自己弁護のために抵抗してるだけ。目的なんか無い。
_で始まる予約語に何があるか言ってみろよ
>>300 やっぱ答え出てるじゃないか。
メンバ変数はグローバルじゃねえ。
関数名とグローバル変数に問題があるだけだろうな
>>301 ,303 予約語じゃなくて、予約識別子ね。
>>305 それならわかるわ
検索してみたら、いいページ掛かったわ
結局 _ をつけたがるのは 自分の作ったのを予約語扱いしてもらいたい 「格好つけしー」 か 考えるのが面倒で、 _ でもつけとけの 「横着者」 のどっちか でいいの?
>>309 昔のDOS系、MSのLIBなんかは _ の関数だらけ
これを予約語といえるかわからんが
それと同列のものにしたいということだろ?
>>309 何が問題ねーの?予約識別子じゃないの?
_ のあと小文字は、グローバルスコープ(ファイルスコープ)のみで予約。以下 >294
>>168 の短い文章を理解するのに一体何レス費やせば気が済むんだ?
「ある目的のために」とか、わかりにくい誤訳が入ってたからじゃね?
グローバルな名前空間でとわざわざ限定してくれてるからじゃん
「感染してますが、コンドームをつけてれば大丈夫です」と言われてもやる気はしないのと同じ 例えが、ちがうか;
( ゚д゚ ) ¶ノ ¶ノ | / ̄ ̄ ̄ ̄ ̄\ ./ (,) (,) ヽ | | ̄| | ヽ  ̄ ̄ / | | | | | .ノ .ノ ヽ ノ .ノ .| (_ノ (_ノ .| / /  ̄/ / < < .< < ヽ ヽ ヽ ヽ
318 :
デフォルトの名無しさん :2007/12/25(火) 07:53:47
あ、そうそう そうすると #ifndef _FILENAME_H #define _FILENAME_H はどんなシンボル名にしてんの? #define H_FILENAME_H とか?( ゚д゚)
FILENAME_HでもMACRO_OF_FILENAME_Hでもお好きなものをどうぞ。
320 :
デフォルトの名無しさん :2007/12/26(水) 04:02:28
MACRO_OF_*は却下
#pragma onceでいいよもう
せっかくポータブルな方法があるのに、 そうじゃない手段をわざわざ使うのは気が引けるよ
323 :
デフォルトの名無しさん :2007/12/29(土) 11:30:30
規律正しいおまいらなら #ifndef の使用はもうやめたんだろ?
両方使うのは意味があるのかな?
>>323 なんで ifndef はいけないと思うの?
皆さんのスタイルを、GNU indentの引数で表現するってのはどうでしょか。 俺は単純に indent -kr hoge.c です。
ソースのフルパスをマクロ名に入れとけば無問題w
そんなにぶつかるのが怖いなら、GUIDでいいんじゃないか?インクルードガードなんか入力することなんかないんだからさ。
330 :
デフォルトの名無しさん :2008/07/28(月) 01:19:20
はてなで話題になってたが tp://d.hatena.ne.jp/akkt/20080424/1209051266 これを厳密に守るのはきついな……
これはJAVAを念頭に置いてるのか?
手続き型脳を矯正するには多少極端なくらいのショック療法が必要ってことだろ
OO厨だった学生時代はそういう病的に分割されたコードばっか書いてたな。 だけど、働き始めて周りの人間にソース追いにくいだのなんだの 不評だったせいでいつのまにか書かなくなったが。
C++でオペレータの宣言・定義するときにoperator=とかくのかoperator =とかくのかそういうのって決まってるの?
それは多分、インデントの量とか中括弧の位置なんかと同じテーマだと思うんだが。
339 :
デフォルトの名無しさん :2008/10/02(木) 00:07:24
operator\w= で検索すればおk
340 :
デフォルトの名無しさん :2008/10/02(木) 00:08:04
↑*追加しといて
\w じゃダメだろ。
342 :
デフォルトの名無しさん :2008/10/03(金) 01:01:52
じゃあ operator\wktk=
elevaterU escalator
あと、a,b,cで書いたなら、最後までa,b,cで通して欲しい。 a, b, cとか行に寄って記述が違うとイラッと来る。
C言語で複合代入演算子やインクリメント/デクリメント演算子の使用禁止って一般的なの? for( iI = 0 ; iI < iMax ; iI = iI + 1){ とか泣けるんですが。iIって変数名も泣けるけど。
347 :
デフォルトの名無しさん :2009/02/08(日) 16:00:56
母国語が違うプログラマだろ
いや、コーディング規約なんだってば。ふつーそうなんだと言われた。
349 :
デフォルトの名無しさん :2009/02/08(日) 21:59:11
規約作った人の母国語が疑われる
VB使いしかいなかったんだろw
>>346 痛々しいな。
1を加算するのに++を使うのもみっともないが
1づつ増えていく値を表現するのに++を使わないのも、なんだかな
break continue 禁止 理由:分かりにくいから。 で、代替のサンプルがすごく分かりにくい。
353 :
デフォルトの名無しさん :2009/02/09(月) 15:12:23
重要なのは「読みやすく、書きやすい」なので、規則は場合に応じてでいいと思ってる。 ぱっと見で理解できやすいほうに改良していく感じで。 基本は固まりがわかりやすいインデント、改行+固まりの概要コメントってとこかな。 class A { public: int i;
354 :
デフォルトの名無しさん :2009/02/09(月) 15:13:48
途中で書いてもうた(^^; class A { public: int i; } よりも class A { public: int i; } のが好き
インデントや変数名なんかは後でどうにでもなるんで、別に構わない。
class A
{
private:
int i;
};
がすき
>>355 変数名はクラス間で衝突するのが当然だから後から置換するのは大変だぞ
コンパイラ相当の解析能力がある名称変更ツールってあったらいいなあと、たまに思う
>>357 JavaとかC#だと当たり前のように存在する。
Eclipseの入力補完とリファクタリングがなければ、もうコーディングできない体に・・・。 viでperlでCGIを書いていた時代には戻れない。
VS2008でもリファクタリング出来ますよ
イマドキのモダンな開発環境なら大概できると思うが。 C++は構文解析の難易度高いんで発狂IDEも多いけどw
namespace の中はインデントする? 俺はしない。
基本はやらないほうだけど、 Java/C#では、IDEが勝手にやってくれるのでそのままやらせている。
いまだに、IDEのエディタよりテキストエディタを使ってる 名前変更は、grepで拾って一つ一つやる そもそも名称変更をする時点で 設計がおかしいってことだし、そういう意味でコードの見直しにもなる というオレは前時代の生き物だが、そうやって生き残ってきたから この部分はそのまんまw
でも、若いのがIDE導入したいって言った時は、 前向きに検討してあげてね。 最近上司にO/Rマッパの話をしたら、 「そんなこと位、ケチらずにSQL書けよw 最近のはSQLも書けないのが多いってことなんかねー」 と言われた若いもんより
手間を減らすための手法は、使う側にメリットがあると感じさせなければただの余計な手間だからなw
Java+WebだとIDEなしは悲惨だぞ。 仕掛け上、膨大な数のファイルを取り扱うし整合性とるのだけでも大変だ。
SQL知らずにO/Rマッパー使いたがる馬鹿
371 :
367 :2009/02/11(水) 20:56:18
>>370 どこからその発想が出てきたのか分かりませんが
そんな人がもしいたら馬鹿ですね。同意です。
372 :
366 :2009/02/12(木) 00:35:22
>>367 いやいや、統合環境でもがつがつ組むときだけテキストエディタを使ってる
私は、フリーだし
誰かの面倒見るときでも、基本的には個人の自由と思ってる
>>371 お前のレスから出た発想に決まってるだろ低脳
おやおや
暇つぶしに煽ったら皮肉で返されて逆ギレっすかw
376 :
デフォルトの名無しさん :2009/02/20(金) 19:25:27
規約とはちょっと違うかもしれないけど、他に聞くとこないのでここでいいかい? コードを管理するディレクトリ構成のことなんだけど、 ソースとヘッダーを同じディレクトリに入れてる人っているかな? ライブラリのコードならヘッダーのディレクトリを分離しなきゃいけないだろうけど、 そうじゃなければ一緒にした方がやりやすいってやってるところもあるのかな?
好きなようにしたらいいと思うぞ。どっちにしても大した問題はないように思える。
いちいち分けないだろ
分けないのか?
IDEにおまかせ。
ライブラリでも配布時にヘッダ取り出せばいいし 必要とメリットに応じて。でいいんじゃない? 自分は分けてない
いや、多いかは知らないぞw 書き込んだ2人は分けてないってだけだからなw
分ける意味がわからん
ハンガリアン表記法はコーディングの手間になるから使わない ただ、ポインタとグローバル変数にはpとかg_をつけてる。取り扱い注意的な意味で。
複数のコンポーネントからなるプロジェクトの場合は、コンポーネントごとにディレクトリを作って なおかつ、共通で使うヘッダファイルのディレクトリも作る。 コンポーネント内部でしか使わないヘッダファイルは、コンポーネントのディレクトリに入れる。
ハンガリアン表記法ね Cの時は使ってる、C++とかオブジェクト指向系の言語だと考えちゃうね
>>385 コーディングの手間になるから使ってる
意識する分だけ誤りが少ないし、検索するときユニークになりやすい
同じ意味で型を変換したい時には楽
コメントの書き方で flag = true; //フラグを立てる とかいうのは意味ないと思う。コードを見ればすぐ分かることを書くのは無駄。 コメントはある程度のまとまったコードに対して、どういう意味があるかを書くと、いちいちコードを解析する手間が省けるから役に立つ。 疑問があるのは、コメントにコードの変更日と変更者を記入してるタイプ。役に立ったことがないんだが、役に立つんかね
10年20年使われるコードでは役に立つときもある
80 名前:デフォルトの名無しさん[sage] 投稿日:2007/11/08(木) 19:23:34 昔も似たようなスレあったな 俺はシステムハンガリアンも有効だとレスした IDEによる入力サポートとか、カーソルあわせての型情報とか一切無い環境もあるからな ってか俺のとこそうだし と書いても理解してもらえなかった。 多分ここでも理解してもらえないなw この意見をどう思う?
>>391 まずはWindows APIみたいにバンバンtypedefしろ。
>>391 役に立つならそれはそれでありだと思う。
よほどチープな機材しかない職場なんだろうな。
>>389 には完全に同意だ
とくに
>疑問があるのは、コメントにコードの変更日と変更者を記入してるタイプ。役に立ったことがないんだが、役に立つんかね
には泣くほど同意見だ。
読みにくいったらないよ。
SCMがあるのになぜコメントで書くのか
>>389 >とかいうのは意味ないと思う。コードを見ればすぐ分かることを書くのは無駄。
まったく同意w
//このフラグはここでのみ立つので、〜ほにゃらら
とか書くならよいのだが、やってることを書くのはほんとアホ
>コメントにコードの変更日と変更者を記入してるタイプ。
おれも役に立ったことがない、コードが読みにくいだけ
だれがどう変えたにせよ、今手を入れるのは自分なんだし
いまさら前任者を恨んでどうするって感じだわw
ファイルヘッダに履歴があれば充分って思う
バージョン管理なんて使わせてくれないところかもしれないだろ。 いや、SCMがあってもそういうのを書かされる話は聞くが。
>>395 > SCMがあるのになぜコメントで書くのか
どこにでもリポジトリがあるわけじゃありません。
あー、こいつが追加変更したところだから要注意だな、みたいなことはある。
いまどきソフトウェア開発プロジェクトでSCMを使わない以上の罪悪を探すのは難しいけどね
>>394 CodeWarriorというものがあってだな…
>>396 変更日・変更者コメントは、同時進行で進んでいるソース流用プロジェクトが、
流用元の最近の変更と自分たちの変更を区別するために欲しがっていたな。
>>401 組込のIDEには入力支援や型情報ポップアップがないって意味?
俺のとこではエディタとして別のIDE使ってたよ。組込の環境は使いにくいw
アセンブラだとメモリにどう入っているか分かるほうが楽
CodeWarrior のクソっぷりはなんとかならんか
>コードを見ればすぐ分かることを書くのは無駄。 アルゴリズムやデータ構造は知ってても、コードは読めんと言う相手と 連携しなきゃならん場合は必要だぞ。 具体的に例を挙げると、↓みたいなコードを、相手方にチェックしてもらうには 「読んで字のごとし」なコードもすごく重要。 ・別言語で作ったアプリが吐いたデータを、整合性を崩さないように編集するコード ・ハードウェアを直接叩くコード
それは、「コードを見ればすぐ分かる」ことじゃない。
コードをみればすぐ分かるってのは、誰でも言語の知識だけでコードからすぐに読みとれること、と言い換えたら理解しやすいかもしれんな。 自分の知識ですぐ分かること、ではないぞw 言語以外の知識やその行付近以外の知識を必要とする時点ですでに「すぐ分かること」ではない。 例えばこういう感じ *((volatile char*)0xF860) = 0; //&HF860番地にゼロを書く ←無駄なコメント *((volatile char*)0xF860) = 0; //VDPリセット ←知識があれば分かることだが役にたつコメント
>>408 >*((volatile char*)0xF860) = 0; //VDPリセット ←知識があれば分かることだが役にたつコメント
これはコードをみればわかることじゃあないと思うな
0を入れるのか、リセットするのか、クリアするのかは、意味が少々違うからな
「文字」「文字値」「文字配列」「文字列」の違いみたいなものも結構気になる
>>409 コードを見れば分かる無駄なコメント に対する 役立つものの例として、という意味ね
「そこにゼロ書けばVDPがリセットされる」って知識がある人には、例の2つは同じ「コードをみればすぐ分かるコメント」に見えるかもしれない
でも、
>>389 で言っている「コードをみればすぐ分かるコメント」ってのは前者(ゼロを書く)であって、後者(リセット)のコメントの付け方ではないよ。
という説明のつもりだったw
#define VDP_ADDRESS (volatile char*)0xF860 #define RESET 0 *(VDP_ADDRESS) = RESET;
412 :
409 :2009/02/21(土) 21:32:26
#define VDP_ADDRESS ((volatile char*)0xF860) #define RESET 0 #define RESET_VDP() *VDP_ADDRESS = RESET RESET_VDP();
マクロ地獄だな
415 :
409 :2009/02/22(日) 01:09:28
>>411 は、レジスタのアクセスだけなのがわかるが、
>>413 だと、いくつかのシーケンスが内蔵されているように見えるね
該当のレジスタに他の値を入れることがたびたびあって、この行でリセットをしたいなら、明示的な
>>411 該当のレジスタには、他でアクセスすることがなく、ここでリセットするだけなら
>>413 だな
皆さんのお知恵をお借りしにきますた どっかの本かWEBで、ブーリアンの引数名にはNoとかNotはつけるな ってあったんだけど、みなさんどう思いますか? 例えばbool NoScrollとか
>>416 本とか読んでる訳じゃないから、俺の感覚だと…
別にbool型なんだから
NoScrollにtrue入れるか、Scrollにfalse入れるかでしょ
それなら、コード中でどう使うかで使い分ければいいんじゃない
絶対に、NoScrollを主体で判断した方がいい部分で使われるのが分っているなら
NoScrollとすれば良い
それ以外で、Scrollという状態をtrue or falseで見る使い方なら
わざわざフラグを反転させる意味にしない方か良いと思う
>>418 どうもありがとうございます
その本だかによれば、ブーリアンは意味的に「〜する」の肯定で統一したほうが混乱が少ない、みたいなことを根拠にしてました
そうやって統一すると、何かを「する」場合はtrue、「しない」場合はfalseを指定すれば良くなる、と
マァ自分的にも個々の使い分けでいいと思いました
>>419 直感的に、True(真)なのにNo(否定)っていうのが誤りの元にならないかってことだよね。
"できるだけ"避けるべきだとは思うなぁ
ちょっとオレが変かもしれないけど
電気ポットの注ぎ口なんかよくハッとする
「赤」なのに「出る」のが気持ち悪い
混在させるより統一した方がいいとは思うけどどっちでもいいと思えるほどの些細なことに見える。
>>416 否定後禁止ルールは、isとかcanとか三人単数ルールとかと併用しないと意味不明になりがちだと思う。
その場合ならCanScrollとかScrollsとか。
酷い日本語すみませぬ…。 ×否定後 → ○否定語 ×三人単数 → ○三人称単数
425 :
420 :2009/02/22(日) 20:35:41
>>422 それはわかってるんだけどねw
出すことを前提に操作してるのに「赤」になるのがとてもアフォーざんす
なして?
信号機だと赤は停止の色だから?
・水は青、お湯は赤 ・熱いから危険だから赤
>425 そこは「お湯を注ごうとしてる人」とは違うアクターを想像するんだ。 例えば「ポットを運ぼうとしてる人」とか。
>>429 わかっちゃいるんだけどね、例えば、車で
アクセルを踏むと赤いランプが点くとしたら、、、気持ち悪いよね
そんな感じ
そのつまんねー自分語り、いつまで続けるつもり?
>>431 2ちゃん歴浅いんか?
嫌ならお前が別の話題を振ればいい。
>>433 2ちゃん歴浅いんか?
気に入らないレスならスルーしろ。
おまえここは初めてか?力抜けよ。
420うぜーぞ
スルーしろといってる本人がスルーできてない
オマエモナー
,;:'';, ,;:' '; ,;'':.:. ';,,,.,.,.,.,.,;:' '; 、:´: . ':, ,':.:..:. . ':, ま、お茶でも飲んで休憩すれ。 ';:.:.:.:.. / \ ':, ';::.:.:.:. . ● ● ;' ';:::.::.:. (__人__) ;' '':;,:.:.:.:.:. . 、:' ( ( ,;:'':.:.:. '::,,.,.,.,.,,.,,_ ヽ ヽ ,;':::: :: `()\; __O__ )ノ ,;' ;:.:. ;, .:.''_,.,,.,.,.,.,.,.,_,:'" \/= ̄ ̄ =ソ,フi! ,;' ;;:.:. ;, ;;'' {= = = = =イ .i! ;' ';;:.:. ;, ;:' ゙、_= = =_ノ i! ;, ';, ,; ;'  ̄ ̄ ┌―‐┐〜 ;, ゙゙''''''" ; { 茶 } :; ;'''"゙゙'';: :; ヘニニノ :; ; ;: ; || ̄ ̄ ̄ ̄ ̄ ̄ ̄|| ':, ,; :; :; || || ゙゙''''''''''" ゙゙''''''''''"
いや、俺はスルーしろなんて言ってないしなあ 命令しといて自分はやらない人につっこみ入れただけだしなあ。
レス乞食
呼んだ?
コメントに愚痴とかいいわけ書いてるやついるよなw そういうヤツのコードは1関数1500行とかスパゲッティな依存関係とかすごく汚いコードだったw そんな事書くくらいならコードの可読性をあげるコメントを書けと
パスカル記法ってただ頭を大文字にするだけ? ハンガリアンみたいに詳細に説明してるサイトがないからそれしかわからん
>>444 >パスカル記法ってただ頭を大文字にするだけ?
そんだけ。
おまいらtypedefどう思う? いちいちtypedefしてんじゃねーよカスが。
なんでもかんでもtypedefするカス typedefしなきゃ書けないコードを知らずに全否定するカス
批判 [編集] 一部の人々は、typedefを広範に使用することに反対している。 ほとんどの議論は、typedefは単に変数の実際のデータ型を隠すだけであるという考えに集中する。 例えば、Linuxカーネルハッカーであり、ドキュメント作成を行っているGreg Kroah-Hartmanは、 関数プロトタイプ宣言を除いて、typedefの使用をやめさせようとしている。 彼は、typedefを使用することが、必要以上にコードを混乱させるだけでなく、 プログラマが巨大な構造体を単純な型と誤認識して使用してしまうことがあると主張している[1]。
>>446 typedefはCとC++ではまったく事情が違う。
C++でテンプレートメタプログラミングするなら必須
そうかなあ
そうだよお
>>451 <>の中が書きにくいとか一行が長くなるとか?
trait
>>454 超大雑把に言うと、
データを渡すために変数が必要なように、型を渡すためにtypedefが必要だということ。
身近な例だとstd::vectorのvalue_typeとか。
自分がメンテするわけでもないコードにコメントなんか書かない。 マクロも定義もしない。 リリースまで立ち会えば、あとは、プリプロセッサを通した綺麗なソースだけを 残す。 後のヤツは苦しめ。俺のときは動いたんだから、それを動かせないのはおまぃらが ドン臭いからだ。 これが派遣渡り鳥の現実です。
>>457 こいつ最低だな。
たいした能力も無いくせに・・・。
派遣雇うような環境なら周りはレベル低いやつばかりだろうから、自ずと自分の
能力が高いとか思いこむんだろう。
こう言うのが人生負け組、嫌われ者で、同じ所から二度と仕事の依頼がないんだろうな。
プリプロセッサがどうのっていう奴がそんなに変なコードを書くわけが無いだろ まあネタでしょ
最低だの能力が低いだのとクサしていればいいさ。 メンテナンスの必要な間の雇用が保証されて給料の支払われる正社員の方はそういうメンテナンスしやすい コードを引けば良いんだから、その分みっちり支払ってコメントかかせればいいよ。 その場限りで使い捨て搾取するんだから、その場限りのコードしか渡されないのは、やむなし。 同じところからの仕事の依頼なんてハナから期待していない。他の仕事していれば、断らざるを得ないし、 間を空けずに次の仕事を言ってくるのに派遣でつないでるようなろくでもない経営者と働くのはそもそも イヤだしな。 ま、どうしても困ったときには呼んでくれ。土日スポット料金でおもくそ吹っかけてやんよ。 ……くらいのものかな。
>>460 このひねくれ具合、もうだめだねこりゃ。
気持ちは分からなくもない ドキュメントもなし、前時代のコーディング規約を押し付けて、ごてごて盛り付けていったような既存のコードの改造で、 テストまでこちらにやらせて、不具合だ未実装だと難癖付けて、ズルズル拘束しておきながら、なにげに機能追加まで盛り込んで 支払いもゴネたうえに、使い捨てるようなクライアントには、そんな対応でもしてやりたくなるわな
プリプロセッサを通したソースって、「綺麗なソース」って言うんかいな? (Cのプリプロセッサの事だよな?) 何もかも展開されて、これを「はい、ソースです」って提出するのはありえんと思う がそうでも無いのか?
バイナリ必須、ソースは形式的に納入するだけでおkという場合もあるし。
メンテナンスが必要になるであろう部分を派遣でどうにかしようということ自体が 間違ってるんではないの?
>>465 メンテが必要ないプログラムってあるのか?
だっらプログラムを派遣に書かせることが誤りだ。
>>467 社員にそれだけの能力がある会社がどれだけあるんだかw
そろそろ言ってもいいよね? マ板でやれ
一般的に、社員と派遣とどっちが技術高いの?
>>470 一言で言えば、いろいろ。
社員だけで足りないから、外に頼む。
外に頼むと、いらんやつがもれなくついてきたりする。
システムの規模によるが、数人〜十数人規模のシステムなら
賢いところは、会社と付き合わずに、個人を特定して捕まえておく。
いいコードは、製品というより作品。
どんなにドキュメントをそろえても
作った会社にメンテを頼むより、作った個人にやらせるほうが数十倍早くて正確だから。
クラス内のメンバの記述順ってどうしてる? フィールド変数・プライベートメソッド・ パブリックメソッド・パブリックプロパティ順にすると 宣言と使用箇所が離れて見にくいし 宣言と使用箇所を近くするにも限界がある 散らかした部屋の中みたい 使っている言語はC# Delphiだと宣言がいやでもまとまるので見やすかった 実現部はIDE任せでアルファベット順だった
>>472 C# の場合は、Visual Studio のクラスビューの並びに合わせてる。
メソッド・プロパティ・フィールド・イベントのアルファベット順か 決めてしまえば迷うこともないかな、やってみる
あれこれ考えるより、多少理屈に合わなくても機械的に決めちゃったほうが楽だよな。
後でどうとでもなるものは、比較的どうでもいいというか、後で考える。 書くときは気の向くまま、というと変だが、気にしないで書いて、あとで整形するから気にしない。
477 :
ゴロゴロ :2009/09/11(金) 21:12:39
XML を定義するときって、要素の名前は <ABC> と <abc> のどっちがいいと思いますか? どっちが一般的でしょうか?
やっぱり俺式コーディング規約って言語ごとに別々に作るもんなの? それとも一個汎用的なの作ったら、あらゆる言語でそれをつき通すもんなのかな
あらゆる言語で突き通す馬鹿とは、できれば一緒に仕事したくないな。
>>479 似た様な言語なら流用するじゃないの。
例えば、Javaのコーディング規約をC#に流用するとか。マイクロソフト標準とちとずれるかもしれないけど。
C++でfunction_name()のように小文字+アンダースコアの関数名って異端ですか?
Stroustrupがバリバリ使ってる
>>482 オレはそればっかり
一方、変数は頭大文字
誘導されてきました C++ でboolのメンバ変数を設定・参照したいんだけど 1) void SetEnable(bool value); bool GetEnable(); 2) void SetEnable(bool value); bool IsEnabled(); 3) void Enable(); void Disable(); bool IsEnabled(); 4) bool Enable(); void Enable(bool value); それぞれの長所と短所を教えてくらさい 一番長所が多いOR一番短所が少ないやつにします
>>485 Enableって聞くと単にbool型変数の値を変更するだけじゃなく、有効にするための処理も含まれてると想像するけど。
それなら3)。
単にbool型変数の値を変更するだけなら1)かなぁ。
EnableXXXにすれ
本筋じゃないけど、 属性としては enabled にしたいなあ。
>>485 > C++ でboolのメンバ変数を設定・参照したいんだけど
実装から名前を決めようなんて考えてる時点で根本的に間違ってる。
>>485 5)
bool set(int id, bool val);
bool get(int id);
1〜4 は変数増えたら API も増えるだろ。
生成時間もメモリ消費量も無駄に増える。
まあ enum でも int でも char * でもいいね。 ただ、enum にするとコンパイラの最適化で short に されちゃったりすることがある。 組み込みの armcc とか。 複数のコンパイラが混在する場合は int か u32_t みたいに CPU で決まる型にしておくのがいいよ。
コンパイラ規約に則ったコーディング規約か、意識したことないな
型チェックしたくない?
>>492 enumの肝は、妙なidをコンパイルエラーにしてくれるところジャマイカ?
>>495 C++だとチェック入るけど、Cだと実質整数だったような。
警告ぐらいは出たっけかなぁ・・・? と思って gcc で試したけど、enum の型に無茶な数値入れても 警告最大だろうがなんだろうが何も言われなかった。
コンパイラが警告を出すか微妙な線だな。 lintなら警告するんだけど。
enum を signed で扱うか unsigned で扱うかも微妙で、 フラグに 0x80000000 立てるのが大好きな人にはウケが悪い。 みんな、ちゃんと -Wextra つけてるか? if (err < 0) って書いて err が unsigned int だったりすると恥ずかしいぞw
今どきエラーを数値で判定する男の人って…
処理系によっちゃ数値で判断するところもあるんじゃね?
中身が数値でも定数と判定しろよ、ってことじゃないの。 if (err != E_OK) とか。
Linux とかだと普通にあるな。
C++のグローバルスコープ解決演算子ってどうしてる? (ネストしてるnamespaceで外側のスコープの解決とかも) 1. 出来るだけ解決演算子を付ける 2. 出来るだけ解決演算子を付けない 3. 名前が重複しがちな関数とか、特定のものだけ注意して付ける 俺はあんまりつけてないんだけど、何にでも付けてる人もいるし、 付けた方がいいよってガイドラインでもあるのかね。 自分の中での取り決めとか、例外とかもあれば教えてくれるとうれし
>>504 1 はウザすぎ、 2 はちょっとウザいことがあるかもしれない、 3 はスタイルとして成立してない。
グローバルスコープ解決演算子をどうする、とか考えるんじゃなくて、要らないものが
書いてあって見づらいなら消せばいいという当たり前の話で済まないのか?
2 だな。 つか、グローバルはご先祖様みたいなもんで身内と 同等の扱いだろ。 どうせ、頻繁に :: つけないといけないような実装は 他でも override とか static 忘れでバグ頻発するような レベルのコードしか書けない奴。
付けるそのものにメリットがある訳じゃないが、 インテリセンス使ってる時は付けた方が便利ゆえ、 付けない事を強制するのもどうかと思う。 そもそも強制したってメリットの無いルールを強制するのは 労力の無駄遣いだと思う。 コンパイラ等でチェックできるならばしても良いとは思うけど。
わしは Windows のプログラム書かんから つけないけど利便性があがるんなら つけてもいいよ。 でも Cライブラリや Win32 API と同じ名前の関数を 自分のクラスに作るのは許さん。 たとえ open/close であっても。
OpenやCloseならいいんですね?わかります。
規約裁定時は宗教戦争が公式に認められる瞬間だからな。
無駄なたらい回しを否定する意味で言ってるなら508の意見には同意。 たまに m_pMember->Hoge(); を Hoge(); と短縮するのが目的みたいな ラッパー関数が存在するが、正直止めて欲しい。
Hoge->m_pMember() を Member() だよね?言いたいことって。
>>509 CLibrary::open(char *file) {
return open(file, O_RDONLY);
}
みたいなのを書く奴がおるんよ。。。
C++ならそれぐらい普通だろ
「無駄なたらい回し」という発想がわからない。 リファクタリング読んだ?
Windowsの関数はマクロで別名付けたりしてるから、 SendMessageとかいう関数を作ったら、実はSendMessageWって名前になってました、とかあるよね。
>519 class Moge{ public: void func(); }; class Hoge { Moge* m_pmoge; private: void func(){ m_pmoge->func(); } //←こーいうの }; Hoge が func() の主語として適切なら良いが、そうじゃなければ リファクタリング云々以前に、オブジェクト指向的に間違ってる。 Hogeを主語とすると不自然なものは、privateであってもメンバに加えるべきじゃない。 どうしてもラッピングしたいなら、Mogeのエイリアスとなるクラスを用意して、 そのクラスを使ってやるべき。
>>521 おいおい、このご時勢にどんだけ時代遅れなんだよ
>Hogeを主語とすると不自然なものは、privateであってもメンバに加えるべきじゃない。 伝説級の迷言 デザパタの半数以上がオブジェクト指向的に間違ってるらしい。
>>521 そのスタンスで何か一つでもアプリを作れたら報告してください。
最終的にあらゆるオブジェクトがお互いの参照を持たないことになるわけですが。
いまんとこ
>>527 のツッコミが一番的確でスマート。
530 :
521 :2010/03/11(木) 22:45:42
>521 >Hogeを主語とすると不自然なものは、privateであってもメンバに加えるべきじゃない。 不正確で誤解を招く表現だったので訂正&補足。 Hogeを主語とすると不自然な「関数」は、privateであってもメンバに加えるべきじゃない。 より適切なクラスに持たせて、そのクラスのオブジェクトなり参照なりを持つようにすべき。 一応文脈的に「もの」=「関数」と読み取って欲しいところだけど、 暴論過ぎますな。すんません。
そこ突っ込まれてると思ったのかw
532 :
521 :2010/03/12(金) 01:25:02
>531 ここじゃなかったら何だろうね。 もしかしたら>521のようなコードを、「全て」否定してると勘違いしてる? 否定してるのは「クラスが関数の主語として不適切な場合」だけだけど。 ProxyやFacadeのようなパターンは否定していない。 (これらは委譲先のクラスの別称あるいは総称であり、主語として適切)
533 :
521 :2010/03/12(金) 01:30:03
追記。 もっともProxyやFacadeのようなパターンの場合、>521のようにラッパー関数が privateになる事はほとんど無いと思うけどね。
すごいな どんどんトンチンカンになっていく
>>521 同僚にお前って鳩山系だよなって言われない?
もうやめとけ。
>>521 =
>>514 なのか?
だとしたら、なぜ
>>514 を良くないと考えるのか、HogeとかMogeとかfunc抽象的な話をせずに、
>>514 のコードがどのような理由で良くないのか、ずばっと主張してくれ。
何が言いたいのかさっぱり分からんから具体名で提示して貰いたいもんだ ユーティリティクラスの全否定にしか見えんが
>>514 はシステムコールのopen()を抽象化してるので良いと思うが。
open()がコードにあちこち登場して、なおかつ"/dev/物理デバイス"をopen()するような
ことだったら目も当てられない(テスト的に)。
541 :
521 :2010/03/12(金) 20:38:38
>537 514≠521ですが何か。 514とは違う切り口で519の「無駄なたらい回し」の例を挙げてるだけなのだが。 いまいち理解を得られてないようなので、例を少し具体的にしてみた。 class Data { public: void SaveToFile() { open(); write(); close(); }; private: void open(){ m_pfile->open(); } //←こーいうのが void write(){ m_pfile->write(); } //←無駄だと void close(){ m_pfile->close(); } //←言いたい File* m_pconfigfile; }; open/write/closeは厳密にはFileに対する操作であるのだから、 Dataのメンバに加えるのは、そもそもオブジェクト指向的に間違ってる。
プライベートメソッドを省略のためだけみたいな使い方するなって言ってるんだろうけど それどこの誰がオブジェクト指向違反だって言ってるの? そのオブジェクト内でしか使わない、昔の C で言うところの static 関数みたいな使い方も 普通によくされてることだし、教科書でも別にあーだこーだ言ってるものは見たことないが。
文字通りその通りのコードだとしたらまさしく無駄だが、 オブジェクト指向的に間違っているのとは違うだろ。 public/protectedでopen/write/closeを公開するのなら 間違ってるかどうかの議論になるが。
544 :
543 :2010/03/12(金) 22:24:51
ほぼ同時刻に、ほぼ同内容でかぶってしまった orz
>>514 は、間違って変な引数入れないように、
決め打ちで引数入れて覆い隠してしまうことならあるな。
>>541 も抽象化と言われれば、まあそうなのかと思えたりもするかも。
確かに基本無駄だろうな。
例えばconfig_openとかの名前にするのはどう思う?それもだめ?
あと、サブクラスでオーバーライドする用なんて可能性はどう?
(厳しい言語はprotectedじゃないとダメなのかな?)
546 :
543 :2010/03/12(金) 22:35:50
ひょっとして
>>512 なのかな?
そもそもWrapperの認識が俺とは違う。
普通、Wrapper関数とかWrapperクラスというのは、AがBを直接呼ばないように(呼ばなくて良いように)
CにAが使うI/Fを定義して(あるいは、Bが提供する機能をCに定義して)、CのみがBにアクセスするよう
にするのを言うんじゃないか?
つまり、Wrapper関数/クラスCはAとBの間に構築するもので、AとBの外側にあるもの。
自クラス内のprivateメソッドにopenを分離するのをWrapすると言うのは聞いたことがない。
委譲の時にもWrapという単語を使うのは見たことないなぁ。
>>541 例えば、数行からなる、複数メソッドで使用するdatabseのopen/write/closeをprivateメソッドとして実装するのも
オブジェクト指向的に間違っているという主張?
それとも単に1行だからNGってこと?
private メソッドの主語まで自身のオブジェクトに紐付けしなきゃいけないとか はじめて聞いたわw やっぱ自称オブジェクト指向技術者はピンキリだね。
>546 >例えばconfig_openとかの名前にするのはどう思う?それもだめ? open/write/close は否定しているが、SaveToFile は否定してない。が答え。 >あと、サブクラスでオーバーライドする用なんて可能性はどう? 541の例で言うと、Fileクラスを派生させてオーバーライドする形式が一番好ましいかと。 >つまり、Wrapper関数/クラスCはAとBの間に構築するもので、AとBの外側にあるもの。 だからこそopen/write/closeがData内にあるのは変という主張なんだけど。 >547 >例えば、数行からなる、複数メソッドで使用するdatabseのopen/write/closeを >privateメソッドとして実装するのもオブジェクト指向的に間違っているという主張? そのクラスとの関連が強い処理で、分離するには粒度が小さくなりすぎる場合「とか」は、 無理して分離する必要は無いと思う。(他にも例外はあるかと) ただし>541みたいに、必要性が薄いのに分離されてるものを別のクラスに引き込むのは 当然駄目/無駄だと思う。
>>549 俺は
>>541 のprivate methodのようなものはWrapper関数とは俺なら言わないよってだけのことで、
Wrapper関数だからclass Dataの外側に持って行けとは言ってないよ。
Wrapper云々については、俺とは認識が違うなぁというだけの話なので、今回の本筋とは全く関係ないよ。
> そのクラスとの関連が強い処理で、分離するには粒度が小さくなりすぎる場合「とか」は、
> 無理して分離する必要は無いと思う。(他にも例外はあるかと)
えーと、分離すべきかどうかの話じゃなくて、オブジェクト指向的に間違ってるかどうかという質問
なんだけど。
databseへのアクセスを提供するクラスではなくて、それを使用するクラスでdatabaseアクセス
部分をprivateメソッドに抽出することもオブジェクト指向的に間違っているのかという質問。
> ただし>541みたいに、必要性が薄いのに分離されてるものを別のクラスに引き込むのは
> 当然駄目/無駄だと思う。
うーん、Fileの場合は間違っていて、databaseの場合は無理して分離すべき必要が無いというのが
良くわからん。
>>549 > 541の例で言うと、Fileクラスを派生させてオーバーライドする形式が一番好ましいかと。
わけがわからん。
class DerrivedFile {
public:
void Open() { open(); }
void Wite() { write(); }
void Close() { close(); }
}
を作れってこと?
これでも状況は全く同様で、
class Data {
public: void SaveToFile() {
open();
write();
close();
};
private:
void open(){ m_pfile->Open(); }
void write(){ m_pfile->Write(); }
void close(){ m_pfile->Close(); }
DerrivedFile* m_pconfigfile;
};
になるだけなんですが。で、今度は何を派生させますか?
クラス無駄にポコポコ作れば俺オブジェクト指向やってるカッケーって脳汁でまくる知的障害者なんだろ
>>549 の論理で徹底するとクラスの数は無限大に発散する
>>541 の例が
>>541 の言いたい事を表す為には全然具体性が欠けていると言う。
それが無駄なのは明白だが、単にその例に限定して無駄なだけでは?
オブジェクト指向的に間違っていると言う話はどこへ?
Dataがセーブ先のpathを自分で管理しなければならない場合はどう実装すれば良い?
結局例も挙げられないほど自分が何言ってんのか理解してないとしか思えない。
無駄なたらいまわしの話なのに、オブジェクト指向的に間違っているとか言い出すから話がおかしくなる
つか、土曜早朝にこんな底辺のスレに人居すぎだろw
まぁ
>>541 マンマのコードを書くような糞馬鹿野郎が実在するなら、そいつはゴミクズである事は誰もが同意するだろう
ただし、>>Hogeを主語とすると不自然な「関数」は、privateであってもメンバに加えるべきじゃない。 には誰一人として同意しないだろう
Dataクラスが実用レベルまで拡張されると、
>>541 の例のメンバが十分な正当性を持ち始めるんだがな。
512=521=541は数万ステップのコード書いた事あるか?
マチガッテル君 次はそんな無意味なコードじゃなくて オブジェクト指向的に間違ってることを表すコードをお願いします 少なくともその無意味なコードはオブジェクト指向的に間違ってるとはいえません
「オブジェクト指向的に間違ってる」と示されたところで、だから何なの?っていう状態は 変わらない気がする。 普通に何が問題なのか(どんな困ったことが起こるのか)を示してくれればいいんだよ。
破綻例を示せって事だな
個人的な妄想じゃないと言うならクラスが主語にならないならprivateだろうとメソッドを作るべきでないと記述されている文献の提示でもいいよ。
ソフトウェア業界はたまーにこういうのが潜んでるから面倒だよね。 一見わかってるふうだからたちがわるい。
>>562 簡単な見分け方がある
「〜は駄目だ」と言う奴は99%役立たずの勘違い馬鹿
コイツの戯言は何一つ聞き入れる必要が無い
「そこは〜にすると良い」と言える奴は99%有益な意見を持つ人間
この見分け方は別にソフトウェア業界に限らない
565 :
545 :2010/03/13(土) 20:12:29
>>549 長文ですまん、横道ですまん、そしてprivateとかprotectedとか無視してすまんが、
例えば、下の2通りの派生の仕方なら下の方が好ましいということ?
で、根拠はFileはopenするものだが、Dataはopenするものではない、SaveToFileならToFileとあるのでより正確、ということ?
(ちなみにconfig_openはOKなんだよな?)
メソッド名が適切ならどっちでもあり?
class DataWithLog : Data {
void open(){ log("open"); super->open(); }
void write(){ log("write"); super->write(); }
void close(){ log("close"); super->close(); }
};
class FileWithLog : File {
void open(){ log("open"); super->open(); }
void write(){ log("write"); super->write(); }
void close(){ log("close"); super->close(); }
};
privateとはいえ、そこにこだわりたい気持ちは分かってきた気がする。命名について考え直すいい機会になった。
少し違うがその場での構造化のためにクラスにメソッドを作る違和感というのは時々感じてた。
クラスの中に、そのクラスしか使わないけどクラスメソッドでもインスタンスメソッドでもないただの関数が書ければそれがいいのかもな。
private:の他にfunction:みたいなのがあれば個人的にすっきりするかも。
なんにしろ、最初から完璧は難しいと思うから、名前は後からでも変えられると気楽に考えてみてはどうよ。
"達人自身にルールを作らせて、ルールに従わせると逆に作業効率が下がった"みたいな話もあるらしいぞ。
出典はたしかリファクタリングウェットウェア。ときには型を破ることも大切らしい。
嫌でも権限の纏わりつく今の世の中、DataはOpenするものだけどね
ちょっと整理しなおしておこう。 漏れが言いたいのは、まず↓は明らかに無駄だって事。 class Data { public: void SaveToFile() { open(); write(); close(); }; private: void open(){ m_pFile->open(); } //←こーいうのが void write(){ m_pFile->write(); } //←無駄だと void close(){ m_pFile->close(); } //←言いたい File* m_pFile; }; だけど、↓は辛うじて許容されると思う。(設計の良し悪しは別として) void opendata(){ m_pFile->open( m_datafile_path ); } 両者の違いは何か?と言う理由を考えたとき、一番単純明快な理由が 前者はオブジェクト指向的に間違ってるという事。 open/write/closeは明らかにFileに対する操作であって、 Dataに対する操作ではない。Dataだけが行う操作でもないし、 DataはFileの別称または総称でもない。 一方、後者はDataだけが行う操作。主体はデータファイルだから 原則を徹底するなら別クラスとして切り離すべきだけど、 その場合クラスの粒度が細かくなりすぎる。 一言でまとめるなら、「無駄なたらい回し」は何を持って無駄か?ってのは、 オブジェクト指向的にどこまでが妥当か?で判断すりゃ良いんじゃないかと 言いたかった。
>551
541の例は単純に↓がベストであると考えている。
open/write/closeをラップしたいなら、Fileをラップするクラスを作り、File*を置換する。
class Data {
public: void SaveToFile() {
//省略
};
private:
File* m_pconfigfile;
};
>552
>クラス無駄にポコポコ作れば俺オブジェクト指向やってるカッケーって脳汁でまくる知的障害者なんだろ
それは549で否定してるがな。
粒度の小さいクラスは、妥当なクラスに併合すれば良い。
でも>541みたいなのはそもそもopen/write/closeをラップする意味がないし、
併合先を間違えているとも言える。(Fileに併合して消滅させるべき)
>557
>Dataクラスが実用レベルまで拡張されると、
>>541 の例のメンバが十分な正当性を持ち始めるんだがな。
それはない。
open/write/closeにDataクラス固有の処理が追加されるならまだわかるけど。
でもその場合も必要になった時点で追加すれば良い。
>565
ルールを押し付けたいのではなく、原則はこうだよねというノリで書いております。
(如何なるルールにも例外はあると思う。)
>566
Dataに「Open」という関数を追加するのがNGなのではなく、
余所で定義済みの関数を、わざわざData内で定義しなおしてるのがNG。
「データファイルを開く」というDataクラス固有の処理ならばOK。
>>569 > open/write/closeにDataクラス固有の処理が追加されるならまだわかるけど。
> でもその場合も必要になった時点で追加すれば良い。
なら単に例のまんまの状態では関数化が要らないっていうだけのあたりまえの話じゃないか。
オブジェクト指向とか持ち出す意味がわからん。
うん 全く無駄な固有例を挙げて無駄だろ?って言ってるだけで オブジェクト指向のオの字すらも関係ないな 固有例であってケースすら示してない
>570 >なら単に例のまんまの状態では関数化が要らないっていうだけのあたりまえの話じゃないか。 >オブジェクト指向とか持ち出す意味がわからん。 当たり前の話というのはその通り。ただ、世の中にはそれを当たり前と思わない人達も居て、 541のような実装がまかり通っている。 (実際、今あーいうコードと格闘中。) なので別の基準としてオブジェクト指向を持ち出してみた。 open/write/closeはその内容を見る限り、Fileに対する操作であって、 Dataに対して行う操作とは違う。 だからオブジェクト指向的にも間違ってる(妥当な実装ではない)、って事で、 これもごく当たり前な事を言ってるつもりなんだが。
>>572 だから何でオブジェクト指向を持ち出すんだよ?
単に無駄だってことを説明すれば十分だろ?
そんなコードを書く奴はオブジェクト指向的に正しいかどうかなんてなおさら興味ないよ。
追記。無駄/無駄じゃないだと、よりもオブジェクト指向的に妥当じゃないという基準の方が、 >567の違いが説明しやすいと思うんだが。 実際、無駄/無駄じゃないだと>567の後者は良くて前者が駄目だという基準が曖昧で 中々理解を得にくいが、オブジェクト指向的に考えると両者に明確な差が出て来るんで (ちょっとだけ)納得して貰い易くなる。
>>572 お前さ、バカが書いたコードで苦しんでるのは分かったから
そのイラツキをオブジェクト指向に対する意味不明な誤解を広める方向に向けないでくれ
主語がなんだとかprivateに持つべきでは無いだとか、何も関係ないだろ?
>>574 > (ちょっとだけ)納得して貰い易くなる。
と勝手に思っていたが、このスレで実はそうはいかないと学習できたわけだ。
まぁがんばれよ。
>>574 馬鹿の書いたコードの無駄さと、お前のムカツキを表すためだけに
何十年もかけて多くの人間が懸命に広めてきた共通概念を都合の良い様に捻じ曲げて使うな
どこからどう見ても全然関係ないだろ
お前ら、とりあえず AA でクラス図描いて来い。
>575 >主語がなんだとかprivateに持つべきでは無いだとか、何も関係ないだろ? 主語が云々は、凄く重要な判定基準だと思うんだが違うのか。 あと「privateに持つべきでは無い」とは言ってない。「privateであっても」だ。 また「持つべきでは無い」であって「持ってはならない」とは違う。 ニュアンスの違いも読み取って欲しい所。
>>579 が俺定義言語を使っていて、会話不能と言う事もわかった
>>579 オレジェクト志向のお話はもうお腹いっぱいです
582 :
545 :2010/03/13(土) 22:33:10
>>579 命名と意味のない拡張と、どっちを問題にしたかったんだ?
あるいは両方?
・命名が良くない
継承(is a)とコンポジション(has a)では、元のクラス(インスタンス)のメソッドを拡張するとき
命名の仕方はそれぞれで変えたほうがよい。それはprivateでも一貫させる。主語が大事。
・意味のない拡張がよくない
所有しているインスタンスのメソッドをそのまま呼び出すだけでは意味がない。
publicなら委譲だが、privateでは無意味。
>>582 多分この子が言いたいのは後者でしょ。
そして持論を補強したくて無理に前者を持ち出してみたら袋叩きにあったと。
>>569 >>557 だが、お前さんは「とにかく否定したい病」の患者なのかい?
>Dataクラスが実用レベルまで拡張されると、
>>541 の例のメンバが十分な正当性を持ち始めるんだがな。
↓
>それはない。
↓
>open/write/closeにDataクラス固有の処理が追加されるならまだわかるけど。
「拡張」の意味を知らないのか?
「持ち始める」のニュアンス(笑)を捉える力が無いのか?
そもそもオブジェクト指向的な概念の話をしているという文脈が理解できていないのか?
>>557 のケースをキッパリ否定した次の行で、
>>557 のケースの存在を認めるって何の意図があったの?
>>579 無駄って言いたいのはもう分かってるからさ
お前さんの主張が書かれてるソースをお願い
オブジェクト指向としてうんたらかんたらって言ってるんだから
俺様が今考えたスタイルですってわけじゃないんだろう?
なんか笑いが止まらんw
>582 後者。「命名が良くない」自体は否定しないけど、こちらの意図とは違う。 >583 「前者」を「オブジェクト指向」に置き換えれば概ね当たり。 単に無意味である以上に、純粋にFile操作するだけの関数が Dataのメンバであるのは間違いだという主張。 「間違い」は言い過ぎだとしても、オブジェクト指向的に 違和感があると思うんだが。 多少のツッコミは予想していたが、正直>575-577,580-581は 熱くなりすぎじゃないかと思った。 何か気に触る事言った?
>>587 は単純にprivateが何なのか分かってない
>>587 × オブジェクト指向的に違和感がある
○ オレ的に違和感がある
>>587 > 「前者」を「オブジェクト指向」に置き換えれば概ね当たり。
だからどうしてそこを置き換えないといけないんだよw
わざとやってるのか?
>584 >「持ち始める」のニュアンス(笑)を捉える力が無いのか? 拡張が必要なら、拡張する時点で追加すれば良いけど、>541の時点では 追加する必要は全く無いというのがこちらのスタンス。 同じスタンスで言ってるなら>577は同意。 ただ違う事を言ってる可能性もあるんで、ああ書かせて貰った。
>591
>582の「前者」は意図してないと断ってるじゃん。
それに>583を↓と置き換えて、こうすれば概ね当たりだと言って何が問題?
>>582 多分この子が言いたいのは後者でしょ。
そして持論を補強したくて無理にオブジェクト指向を持ち出してみたら袋叩きにあったと。
>>592 ・・・
「拡張」されたら「持ち始める」といってるのに、お前さんが同じ事だと理解出来る為にはこれ以上何の補足が必要なんだ?
595 :
591 :2010/03/13(土) 23:40:27
>>593 あぁそういうことか。ごめん。読み違えてた。
ニュアンスを汲んで欲しいとか文脈から読み取って欲しいと偉く上から目線で言ってっけど
>>593 が一番国語力ありませんがなww
自分がコミュニケーション能力不足なのを人のせいにせんといてwww
汲んでほしいとか読み取れるはずとか 人のせいにばかりしてるから そんなに日本語が不自由なんだ
>594 いや、理解したからこれ以上の補足は不要。 こちらの読解力が足りていなかったと言う事で。 拡張すると意味を持ち始めるから、それに備えて実装しておく意味がある、 という主張かと思ってしまっていた。
>596-597 日本語不自由なのは認める。 あと上から目線っぽいのは、2chだからってのと、 口調を突然変えるのもどうかと思ったから。 不評のようだから変えます。
>>599 オブジェクト指向の下りは全面撤回ということでおk?
>600 いや、撤回はしません。 至らぬ所があると思うんだったら、ツッコミ入れてくれれば、 納得してくれるまで説明しますよ。 ただし煽りや的外れすぎ等で回答しずらいのはスルーさせて貰います。
>>601 貴方の説明は要らないんで、同内容が書かれていた文献を教えてください。
>>601 の主張内容は理解したけど
オブジェクト指向的に間違っていると言うのには全く持って同意できない
俺ルールじゃないと言うのなら絶対に参照元があるはずだし、それを示せば一発でしょ
このスレにオブジェクト指向の開祖が居ると聞いて。
「無駄な間」はオブジェクト指向的に間違っていて 「無駄でなくなった」瞬間にオブジェクト指向的に正しくなる このこじ付けには一切正統性が無く、意味不明です。
privateにおいて そのインターフェースがクラスに相応しいかどうかは 実装に依存する、ということなのか? オブジェクト指向的に考えて
だとしたら噴飯物だよね オブジェクト指向的に考えて
そんな些細な実装に依存してしまったらどうやってクラス図書けばいいのん
>602,603 自分なりの解釈に基いて書いているので、コレという「ソース」はありません。 逆にこちらが間違っていると断言できるソースがあるなら示して下さい。 >606,607 「privateであっても」の部分が引っかかるというなら、 まずその部分は取っ払って考えて下さい。 (例えば>541のopen/write/closeは「Data」の操作と言えますか?) オブジェクト指向的に相応しくないメンバであるなら、 privateであっても極力排除した方が良いと思いますが。 privateなら良しとするべき理由があるならともかく。
追記。 privateにすれば無問題というのは、オブジェクト指向プログラミングという 技法的には間違ってないと思うけど、思想的には間違っているはず、 と言った方が伝わるでしょうか。 >605 無駄かどうかとは別の角度、つまりオブジェクト指向的に妥当か否かでも 判断できるよねと言う話であって、両者をこじつけたい訳じゃありません。 こじつけて語ってしまった部分もあるかもしれませんが。
>>609 悪魔の証明を求めないで下さい。
こちらは、そんな寝ぼけた主張をしている文献があるはずが無いと言ってるんです。
なにを言われてるか理解できていますか?補足が必要ですか?
>611 >そうしないと、どんな困ったことが起こるというの? privateならOKとか言い出すと、例えば全ての関数を 1個のクラスにprivateメンバとして詰め込んだ実装も オブジェクト指向的に間違いじゃないと言えてしまいますが。 privateであっても「そこにあるべきと言えないもの」は極力分離すべき、 というのが原則で、クラスの粒度が過度に小さくなるのを防ぐ、 等の理由があるなら例外として認められる、というのが オブジェクト指向的に正しい考えかただと思いますが違うんで?
粒度の判断も分割すべき次元も人それぞれの裁量に任されるべきで、オブジェクト指向はそこに踏み込みません
本質とは全然関係無い話なんで、勝手にすればいいとされています
>>613 はオブジェクト指向を全然理解せず、実装に引きずられ過ぎです
書籍は1冊も読んだ事が無いと容易に伺えます
>>613 にはオブジェクト指向を語る資格がありません
>>613 611じゃないけど、その例なら個人的にはありだな。
そのクラスでしか使わないものを、そのクラスに閉じ込めておくのは
他で使われる心配をしなくて済んでいいと思うぞ。
その関数を修正するとき、そのクラスだけ意識すればよくなる。
privateのいいところだな。
>>613 おまえ隠蔽の意味が全然分かってないだけ。
>privateならOKとか言い出すと、例えば全ての関数を
>1個のクラスにprivateメンバとして詰め込んだ実装も
>オブジェクト指向的に間違いじゃないと言えてしまいますが。
実装としてどうなんだ?と言う話で、オブジェクト指向的にはどこにも間違いが見当たらない。
>>613 は、ただの実装の善し悪しとオブジェクト指向の正誤を取り違えちゃってる子
>>613 > オブジェクト指向的に間違いじゃないと言えてしまいますが。
あぁそうだ。そしてそう言えるとしても誰も困らない。
1個のクラスにすべて詰め込んだ実装はいろいろとマズイわけだが、
それはオブジェクト指向とは関係なく説明できる。
> オブジェクト指向的に正しい考えかただと思いますが違うんで?
何を聞いても最終的にオブジェクト指向(しかも脳内)しか出てこない
のもおかしい。その先にある具体的な利点や解決される問題点を示す
ことができないのなら、そんなオブジェクト指向には何の意味も無い。
>>618 だよなw
何を聞いても最終的には「俺の中のオブジェクト指向ではそれは正しくない」で話が終わってしまうw
620 :
615 :2010/03/14(日) 04:31:48
すまん、どうやら読み間違えたようだ。 全てのってそのクラスしか無い状態か。 いままでprivateの外にいた奴らは、追い出せばいいんじゃないか? ・・・また読み間違えてる気がする。
ここまで長々やって一人も賛同者が居ないと言うのに、自分を疑うと言う事を知らないのか?
80年代ならまだしも、2010年にもなって
>>613 みたいな、勘違いを公衆に発信してる奴を見るとなんか虚しくなるな・・・
言ってしまえばオブジェクト指向の要点なんて情報のカプセル化しか無いだろうに、何でこんな酷い勘違いが出来るんだか・・・
なんというか、数の数え方も知らずに数学について語ってるみたいな奴・・・
まあオブジェクト指向がらみにはこういう変な理解しちゃった子結構いるからなぁ。 ちょっと前まではそういう人たちは XP に移ってたけど、今はどこで何してるんだろう?
>622 「カプセル化」のとはprotected/private化するだけじゃなくて、 クラスとして抽出して外部に追い出す事も含まれると思いますが。 (クラス化自体カプセル化の一種であるというのは、何かで読んだ気がするので探してみます) でもって>541みたいに必要も無いのに他のクラスのメソッドを引き込むのは、 隠蔽レベルを下げる行為だと見なせますよね?
>>クラスとして抽出して外部に追い出す事も含まれると思いますが。 一切微塵も欠片も小指の先ほども含まれて居ない。 「クラスの抽出をする事をカプセル化と言う」などと解説している物があるなら提示を。 >>隠蔽レベルを下げる行為だと見なせますよね? Dataを外から見た場合、open write closeは完全に隠蔽されている。 というか、privateなのに一体どこで何が下っているのか、想像も付かない。 そして、全く同じシグネチャでも、必要性があれば隠蔽レベルを下げているとは言わず 必要性が無い時だけ隠蔽レベルが下るという主張も意味不明。 全く同じコードでも、閲覧者の主観によって隠蔽レベルが変わるというなら、コンパイラは一体何をすればいいのか。 隠蔽について、まともな本を読み勉強しなおせ。
>627を踏まえて>625を訂正。 でもって>541みたいに必要も無いのに他のクラスのメソッドを引き込むのは、 カプセル化のレベルを下げる行為だと見なせますよね?
C++の薄汚れた擬似オブジェクト指向はあんま好きじゃないな Smalltalkとは言わないからせめてJavaレベルで話して欲しい
>>628 使用者はDataのSaveToFileを呼び出すだけで良い事は変わらないのでカプセル化は保たれています。
Dataの中がどうなっていようが関係ありません。
関係ないからカプセル化です。
>630 Dataのヘッダに、Fileの実装やDataがどの関数を使用しているかという 振る舞いが一部見えてます。 (コンパイラは見て見ぬフリをしますが) open/write/closeを追い出せば、カプセル化はより完璧になります。
「それ」に「オブジェクト」を認め、「カプセル化」するとした時に 「カプセル化」の手段として「クラス」があり「隠蔽」がある。 「カプセル化」され、「隠蔽」されているなら、どのような「実装」だろうと関係ない。 ましてや「実装」により「隠蔽」や「カプセル化」が脅かされる事は、絶対に無い。 絶対に、無い。
>>632 オブジェクト指向にヘッダなんて概念は存在しません。
そろそろ死んでください。
ここまでで唯一分かった事 613はC++の言語仕様の事をオブジェクト指向と呼んでいる - 完 -
Dataクラスの利用者から見て、Fileは以前隠蔽されたままだと言いたいのはわかります。 でも「抽出・分離」して隠蔽することを「カプセル化」と言うのだから、 Fileクラスとして抽出・分離されているものを、Dataクラスに必要以上に 結合するのはカプセル化を逆行してるでしょうに。
DataクラスとFileクラスはDataクラスにprivateメソッドを作ろうが作るまいがデータ結合です。 結合度は変わりません。オブジェクト指向として理想的です。 >Fileクラスとして抽出・分離されているものを、Dataクラスに必要以上に >結合するのはカプセル化を逆行してるでしょうに。 意味不明のオレ概念です。使用を控えてください。 そしていい加減死になさい。
>>でも「抽出・分離」して隠蔽することを「カプセル化」と言うのだから、 だから違うと何度も言ってるだろう。 「カプセル化」とは「オブジェクト」を具現化する事であり、抽出も分離も隠蔽もその手段でしかない。 そこまで致命的にトップダウンな思考が出来ないのなら、一生オブジェクト指向を理解することは無い。
>>627 お前はe-wordsをチョロっと読んだだけで、浸透まで何十年もかかったパラダイムを理解した気になっている・・・のか・・・?
失笑と言うか・・・・脱力感が・・・ヤバイ・・・
何を聞いても最終的にカプセル化(しかも脳内)しか出てこない のもおかしい。その先にある具体的な利点や解決される問題点を示す ことができないのなら、そんなカプセル化には何の意味も無い。
e-wordsで200文字読むだけで今日から君も立派なOOPerだ!やったね!
>>640 =632?
やっと後釣り宣言出たって感じ?
>640 Data内で使用しているFileのメンバのシグネチャを変えても Dataに一切影響がないようにするには、>541のような隠蔽だけでは 不十分です。 例えばopen に引数が追加されたら、Data::openも変更が必要です。 一方、Fileの派生クラスまたはラッパークラスを用意し、そちらに定義しておけば シグネチャ変更の余波は、Dataに到達する前に止められます。 例: class DataFile : public File { /*省略*/ }; class Data { public: void SaveToFile(){ m_pFile->open(); m_pFile->write(); m_pFile->close(); } private: DataFile* m_pFile; }; このように、「別クラスに抽出」して「隠蔽」する事をカプセル化と言うのであり、 単に隠蔽するだけをカプセル化と言うのじゃありません。 多くの解説書でアクセス制御=カプセル化として説明してますから 誤解するのも無理は無いと思いますがね。
>>643 > 例えばopen に引数が追加されたら、Data::openも変更が必要です。
> 一方、Fileの派生クラスまたはラッパークラスを用意し、そちらに定義しておけば
> シグネチャ変更の余波は、Dataに到達する前に止められます。
わざわざ作った「Fileの派生クラスまたはラッパークラス」には変更が及ぶんだろ。
そこに変更が及ばないようにまた何かラッパークラスでも作るの?
それで誰が喜ぶんだよw
>>643 Fileのパブリックメンバのシグネチャ変えたら使用側全てに変更が及ぶなんて当たり前すぎて何が言いたいのかわからない。
それにData::openの実装の修正は必要だがシグネチャの変更は不要。
お前はなぜ何故実装とシグネチャの区別が付かない。
そうやって無限ラップ地獄の明らかに破綻した論理を大事に墓まで抱えていけば。
パブリックなシグニチャの変更を極力抑えるのが隠蔽でもあるんだけど愚かだねー
>>643 こいつは主語が分かってない
DataクラスがDataクラスに対して隠蔽してどうすんだ
馬鹿すぎる
ここまでの論理破綻は中々お目にかかれないでござるの巻
>>643 Fileのpublicメンバを変更したらそれはFileのカプセル化が漏れたことになります。
その公開されたメンバを使用している箇所でも修正が必要です。
DataはFileを使用しているため実装に変更が必要になります。
それはFileのカプセル化が漏れたためであり、悪いのはFileです。
publicメンバを変更したFileが悪いのです。Dataは被害者です。
DataFileクラスを新しく作る必要があるのはFileのカプセル化の漏れを
新しいカプセルで覆う必要があるからです。
DataFileのカプセル化に成功した場合は、Dataの実装を変更する必要は無くなります。
541のコードのままでも変更は必要なくなります。
なぜならそれがDataFileのカプセル化の効果だからです。
DataFileがFileからの被害を受け止めることで、Dataが救われました。
DataFileは救われませんが。
>>643 の主張はDataをDataFileに置き換えても再帰的に成り立つ
なぜなら、DataFileも本来関係ないはずのFileの変更に影響されるべき物ではないからだ。
コイツがここまで不勉強な奴だったとは・・・
>>541 みたいなコードを書いたという元コーダの正当性も再評価する必要があるな。
全うにコーディングしてたら馬鹿に絡まれ馬鹿に馬鹿と晒し上げられた、ただの被害者の可能性がある。
ここまで馬鹿ばかりだとは… そもそも Data::open を作る意義が何なのか分かってますか? >全員
さぁやーっとオチがつくぞー
Data の取得方法ってファイルだけなのか?
>>653 わからないし、そこを明らかにしないと作成の是非なんか話にならないはずなのに、
「オブジェクト指向的に間違ってる」だの「カプセル化が不完全」だの抽象的な
概念(しかも脳内)を具体的な問題点と繋げないまま繰り返し言うだけで、それで
納得しなかったら馬鹿よばわりとか、どんだけ
平和だなぁ
>>653 >>541 のケース「限定」で「Data::openは無駄だ」という当初の主張から翻り、今度は作る意義ですか。
さっぱり分かりませんが、作る意義って何の事を言ってるんですか?
個人的に作る意義は沢山存在しますが。貴方の言ってる事は本当に意味不明です。
関数つくる意義なんてたいてい抽象化じゃないのか? オブジェクト指向でも構造化プログラミングでも。
ほんと笑いがとまらんwwww
>659 その通り。抽象化です。(カプセル化、あるいは隠蔽化でも良いと思いますが) では次。 @抽象化のメリットは何ですか? AData::open は何に対して、何を抽象化してますか?
,. -‐'''''""¨¨¨ヽ (.___,,,... -ァァフ| あ…ありのまま 今 起こった事を話すぜ! |i i| }! }} //| |l、{ j} /,,ィ//| 『おれは奴に具体的な問題点を聞いていた i|:!ヾ、_ノ/ u {:}//ヘ 思ったらいつのまにか聞かれていた』 |リ u' } ,ノ _,!V,ハ | /´fト、_{ル{,ィ'eラ , タ人 な… 何を言ってるのか わからねーと思うが /' ヾ|宀| {´,)⌒`/ |<ヽトiゝ おれも何をされたのかわからなかった… ,゙ / )ヽ iLレ u' | | ヾlトハ〉 |/_/ ハ !ニ⊇ '/:} V:::::ヽ 頭がどうにかなりそうだった… // 二二二7'T'' /u' __ /:::::::/`ヽ /'´r -―一ァ‐゙T´ '"´ /::::/-‐ \ 催眠術だとか超スピードだとか / // 广¨´ /' /:::::/´ ̄`ヽ ⌒ヽ そんなチャチなもんじゃあ 断じてねえ ノ ' / ノ:::::`ー-、___/:::::// ヽ } _/`丶 /:::::::::::::::::::::::::: ̄`ー-{:::... イ もっと恐ろしいものの片鱗を味わったぜ…
>>661 の言ってる事がさっぱりわからない
オブジェクト指向とか本読むのめんどくせえから1から俺に教えてくれって事?
とりあえず◆79cfdX7bxMにはキチガイ認定を
こっちの方が考え方としては分かり易いか。
ttp://itpro.nikkeibp.co.jp/article/COLUMN/20060607/240196/ >役割とは,「オブジェクトが果たすべき機能」のことで,オブジェクト指向では
>「責務(Responsibility)」と呼ぶ。通常はクラスにメソッドを実装することで,責務を実現する。
>
>オブジェクトに最適な役割を割り当てることは,
>「適切なクラスに適切な責務を配置する」ことに他ならない。
ファイルのopen/write/closeという責務は Fileが負ってくれているのだから、
Dataまで担う必要ありません。
↓以下、Dataが担っているのはDataのopen/write/closeだといい始めるループ
>>665 オレジェクト指向の宣教活動は自重してください
スレ違いですし、単純に迷惑です
>667 その先は付きあい切れません。 ではおやすみ。
>668 ここまで物分りが悪い奴ばかりと思ってませんでした。 (もしかして釣られたのか。) では今度こそおやすみ。
privateで言うのもおかしいが、DataはそのままFileに委譲してるのにFileの責務を負ってるらしい 自己都合によって捻じ曲げるとこんな醜態を晒すという例
>>669 寝る前にどこ立て読みかネタばらし頼む
俺もスッキリ寝たい。
>>670 馬鹿は絶対に自らの間違いを認めない特性を持つが故に、馬鹿は死んでも直らないと言われる。
俺がこれをどちらに向けて言ってるかは、お前が決めれば良い。
典型的な救いようの無いタイプの馬鹿でワロタ
なんとなく言いたい事が分かってきたかもしれん。 DataとFileが密結合になるのが嫌なのだと思う。 まずDataの中にFileをコンポジションで所有するのが、気に入らない。 DataにFileの特性が入り込んでしまう。継承よりは疎結合だし、必要なので我慢する。 だがDataからFileのメンバを使うのは、それだけ結合が増えるので嫌だ。なるべく避けよう。 でもSaveToFile関数でopen/write/closeの3個を使うのは、避けられないから我慢する。 だがopen/write/closeを分けて委譲するのは、同じ3個でも3カ所に分かれるのは結合が強まる。 それに委譲を作るのも、まるでオーバーライドのようで結合が強まっているようだし、そもそもDataの特性に合わない。 SaveToFile関数のローカル内だけで済んでいた結合がDataクラス全体に拡散してしまうなんて悪夢だ。 という考え方なんだと推測したがどうだろう?
>>675 多分そうなんだろうねー
でもそれらのどこでも結合は強まってないんだけどねー
Data内部でopen/write/closeに分けた方が抽象化の度合いが高まって、より疎になってるんだけどねー
Dataはopenする物ではないという決め付けにまず驚愕
そしてこんだけ延々とスレチを続けるあたりがもうね。
あーあー、見苦しいなw >671 >665 >通常はクラスにメソッドを実装することで,責務を実現する。 つまりopen/write/closeを追加する事自体、責務を増やしている。 m_pFile を持てば十分なのだから増やす必要は無い。 >673,674 お前らにそっくりそのまま返すw >676 open/write/closeを抽象化したところで、m_pFileを通してFileが丸見えだから 抽象化の度合いは全く高まっていないし、「より疎」にもなっていない。 むしろ675の言う通り無駄な経路を増やしてる。 そもそもopen/write/closeを拡張する場合、Fileを派生するかラッパー作って拡張し m_pFile の型を変えれば良いのだから、open/write/closeを作らなくても 十分抽象化されてて疎の状態。 >677 「Dataをopen」を意味する関数であれば、privateにはしないでしょうに。 >678 超ド素人でも感覚で理解してるような原則を延々説明しなきゃならんとか、 こっちも想定外だってw
>>679 > 通常はクラスにメソッドを実装することで,責務を実現する。
↓
> つまりopen/write/closeを追加する事自体、責務を増やしている。
private に open/write/close を追加したことで増えた Data クラスの責務って何よ?
>>679 その Data クラスにありそうな拡張って例えば、
・最後に保存してから変更があったかどうかのフラグの処理
・ロギング
のようなものが考えられると思うが、両方とも欲しい場合には
FileWithLoggingAndModificationFlag みたいな派生クラス
を作れって言ってるの?
682 :
551 :2010/03/15(月) 10:45:15
出遅れ感ありありだが……
>>569 > 541の例は単純に↓がベストであると考えている。
> open/write/closeをラップしたいなら、Fileをラップするクラスを作り、File*を置換する。
> class Data {
> public: void SaveToFile() {
> //省略
> };
> private:
> File* m_pconfigfile;
> };
完全な例を書いてくれないかな。それ
>>551 と何が違うの?
あ、ちなみに
>>551 は一部書き損なってたとこがあった。
> class DerrivedFile {
↓
> class DerrivedFile : public File {
>>579 > あと「privateに持つべきでは無い」とは言ってない。「privateであっても」だ。
他の奴はどうか知らないが、俺がこだわってるのはこれ。
public/protectedならともかく、privateに
>>541 のようなメソッドがあることが
なぜオブジェクト指向的に間違っているかだ。
> ニュアンスの違いも読み取って欲しい所。
いやいや、お前がニュアンスを文章として的確に表現しろよ。
>>679 > m_pFile を持てば十分なのだから増やす必要は無い。
オブジェクト指向的というなら、そもそもclass Dataにm_pFileを持たせること自体がどうかと思う。
Dataには、自分自身を表現するメソッド、例えばtoString()とかイテレータを実装しておき、
永続化を担当するクラスの方に、Dataを渡す方がいいんじゃないか?
その先は付きあい切れません。 ↓ あーあー、見苦しいなw わろた
>>683 シーッ!
ペラい経験と先入観で気持ち良さそうに語っちゃってる痛い子にそんな事言っても理解不能です
>>682 >public/protectedならともかく、privateに
>>541 のようなメソッドがあることが
>なぜオブジェクト指向的に間違っているかだ。
ヘッダを読むと見えちゃうかららしいw
そこで爆笑したw
ヘッダを読むとは何の話ですか。 オブジェクト指向で言うと、どの行為に当たりますか。
>>682 俺も思ったけど一番肝心な所が//省略されてて意味不明だった
何が話されてるのかさっぱり分かってないただの馬鹿と判断してスルーしたけど
>>679 >m_pFileを通してFileが丸見えだから
イミフミエ
そもそも
>>541 にm_pFileというメンバは存在しないところから謎は始まった。
>680 例えばopen等のメンテの度に、Data全体をコンパイルし直さなければならないというコストです。 >681 うんにゃ。拡張したopen関数が、Dataに負わせるに相応しい債務であれば Dataに入れても良いと思います。 ちなみに何の拡張もされていないopenを追加する目的は、「openの拡張に備えて」だろうけど 「必要に成った時点で追加」と言う方針で困るケースなど無いから、杞憂というものです。 >682,668 >551と>569の違いは、Dataがopen等を実装しているか否かです。 >569のSaveToFileの中身は↓です。 SaveToFile() { m_pFile->open(); m_pFile->write(); m_pFile->close(); } >683 そうですね。 まぁダメな例をちょっと改善したに過ぎないので、ツッコミ処はいくらでもあるかと思います。 >684 その先って>667の無限ループの事ですよ? >687,689,690 細かい事は気にせず書いてるから、多少おかしな部分はあるかもしれません。 ツッコミたければ好きなだけどうぞ。全部甘んじて受けておきますよ。 以降は、些細なミスについては一々弁解・謝罪するつもりは無いのでよろしくお願いしますね。
>>691 > 例えばopen等のメンテの度に、Data全体をコンパイルし直さなければならないというコストです。
そのメンテの度にコンパイルし直さなければならないという発生するコストは、
SaveToFile() の中で全部やってなかったら発生しなかったというのかね?
693 :
692 :2010/03/15(月) 20:50:52
ごめん書き直す。
>>691 > 例えばopen等のメンテの度に、Data全体をコンパイルし直さなければならないというコストです。
聞いたのはクラス Data の「責務」なんだけど、なんでコストの話になったの?
コストの話にしてもおかしいよね。
そのメンテの度にコンパイルし直さなければならないというコストは、
SaveToFile() の中で全部やっていれば発生しなかったというのかね?
いいかげんスレタイ読み直せ
>692,693 「コスト」という表現が分かりにくいなら、open等のメンテの度にDataも影響を 受けざるを得ない、要はopenと一連托生になる、ではどうでしょうか。 (話が逸れますが、openとDataはm_pFileを共有する、共有結合だって事も分かりますか?) >SaveToFile() の中で全部やってなかったら発生しなかったというのかね? File* を外部から渡す構造にしておく、等の条件付ですが発生しない設計にできますよね。 まぁ open等を作った場合も同じ方法で発生を抑えられますが。 けどそれやったら、丁度>551のような状態になります。 Data内のopen等が無用の長物と化しますね。 オブジェクト指向で考えても、結局行きつく結論は「無駄」でしたね。 皆様お疲れ様でしたw
おまえらIDの出ない板でよく集中力もつなw
最後に書いた人の勝ちルールでやってるからっしょ。
>>(話が逸れますが、openとDataはm_pFileを共有する、共有結合だって事も分かりますか?) 天変地異級の大勘違いです。 一体今までの話のどこにグローバル領域が存在したというのか。 そもそも、クラスと、そのクラス自身のメソッド間で結合度? どこまで馬鹿なんですか? 結合度とは、オブジェクト(クラス)間の関連を語るものです。
>File* を外部から渡す構造にしておく、等の条件付ですが発生しない設計にできますよね。 File* を外部から渡しても無意味だと思うのですが、実際にDataをコンパイルしなおす必要がない設計をしてもらえますか。 何を想定してるのかさっぱり想像がつかないので とりあえずFileのopenが廃止され、open_streamのみになったケースに対応してください。
700 :
551 :2010/03/16(火) 00:48:38
>>691 > >569のSaveToFileの中身は↓です。
> SaveToFile() {
> m_pFile->open();
> m_pFile->write();
> m_pFile->close();
> }
え?これが理想型なの?
これだとclass Dataとclass Fileの結合度は全く変わってないよね?
それから「責務」とか「openを実装する」とかの話になっているけど、もともとprivateメソッドの話だよ?
m_pFile->open()をprivateメソッドに括りだしたら、責務が増えたという認識?
俺的には、「Dataにopenを実装する」と言えば、それは大抵publicの話であって、百歩譲っても
protectedの話。
やっぱり「一行しかない処理をprivateメソッドに括り出すのって無駄なたらい回しだよね」以上の
オブジェクト指向的な何かが関係してるとは読めないよ。
701 :
551 :2010/03/16(火) 00:51:12
>>695 > File* を外部から渡す構造にしておく、等の条件付ですが発生しない設計にできますよね。
の完全な実コードをお願い。
> まぁ open等を作った場合も同じ方法で発生を抑えられますが。
の完全な実コードをお願い。
> けどそれやったら、丁度>551のような状態になります。
> Data内のopen等が無用の長物と化しますね。
この二行の意味がわからないので。
ふつうは File->Save(Data); じゃないの?
>>691 念のため言っておきますが、あなたが突っ込まれてる箇所はオブジェクト指向の基本中の基本で、
非常に致命的でお話にならない勘違いをしている所ばかりです
度合い的に言うと、÷記号って両辺の数字を足せばいいんだよね?レベルです
(しかもあなたは、÷記号は両辺を足すという意味なのを理解してないの?お前ら馬鹿じゃないの?と言うスタンスで語っています)
細かい所なんて誰も突っ込んでません
突っ込みきれる量じゃないからです
すげーな ◆79cfdX7bxMが書いてる事でオブジェクト指向的に正しいことが本当に一つも無い 細かい事気にしてないとか そんなチャチなもんじゃあ 断じてねえ
>>695 のプログラマ歴って業務で何年なの?
俺5年なんだけど(お陰で周りは正しいOOPに満ちていた)
>>695 の言ってる事がちっともわからん。
「無駄」から話が始まったはずなのに「結局行きつく結論は「無駄」でしたね。」とか再発見されても、困惑する。
一体どこを目指していたの?
一番最初に分からない部分。 > 「コスト」という表現が分かりにくいなら、open等のメンテの度にDataも影響を > 受けざるを得ない、要はopenと一連托生になる、ではどうでしょうか。 > (話が逸れますが、openとDataはm_pFileを共有する、共有結合だって事も分かりますか?) openはDataのopen?Fileのopen? 1. Dataのopenの場合。 Data::openのメンテをする場合Dataが影響を受けるのは当たり前。 よってDataが主語に来ることは在り得ない。 2. Fileのopenの場合。 File::openのシグニチャに変更が無い場合はDataが影響を受けないのは当たり前。 File::openのシグニチャに変更があった場合は、どんな形であろうと、呼び出しているDataが影響を受けるのは当たり前。 そして併せて↓が成立しない。 > (File::)openとDataはm_pFileを共有する よってFileが主語に来ることは在り得ない。 ∴どちらを主語にしても成立しない。
次に分からない部分。 > File* を外部から渡す構造にしておく、等の条件付ですが発生しない設計にできますよね。 > まぁ open等を作った場合も同じ方法で発生を抑えられますが。 ↓ > けどそれやったら、丁度>551のような状態になります。 ↓ >Data内のopen等が無用の長物と化しますね。 話が繋がってない。 重要な言葉を略しすぎで、人に伝える能力が無い。
>m_pFileを通してFileが丸見えだから 指摘したのに細かいとか一蹴されててワロス Fileの公開メソッドへアクセス可能なことを丸見えといってるのか、 DataのprivateメンバにFileのインスタンスが存在する事をもって丸見えと言ってるのか どちらにしろ超絶馬鹿 イミフミエ
709 :
デフォルトの名無しさん :2010/03/16(火) 10:09:00
さらしage
ちゃんと「ごめんなさい」が言える子に育ててもらえなかったんだね。かわいそうに。
711 :
デフォルトの名無しさん :2010/03/16(火) 12:56:00
>>627 > データとそれを操作する手続きを一体化して「オブジェクト」として定義し、
> オブジェクト内の細かい仕様や構造を外部から隠蔽すること。
その通り。
>>628 > でもって>541みたいに必要も無いのに他のクラスのメソッドを引き込むのは、
> カプセル化のレベルを下げる行為だと見なせますよね?
見なせない。外部からは何も変わっていない。
>>636 > でも「抽出・分離」して隠蔽することを「カプセル化」と言うのだから、
微妙に言い回しを変えてるが、
>>627 にあるとおり「外部から隠蔽する」というのが
カプセル化の定義。
> Fileクラスとして抽出・分離されているものを、Dataクラスに必要以上に
> 結合するのはカプセル化を逆行してるでしょうに。
何が「必要以上」なのかさっぱり分からんが、privateメソッドを作ろうが作るまいが、
DataとFileの結合度には何の影響も与えない。
そもそもあるクラスがあるクラスを使う(use関係)というのは、カプセル化とは
何の関連もない。
さらには、あるクラスがあるクラスを使うと決定した時点で、結合するのは逃れられない。
ちなみに、その結合を逃れる手段は
>>683 。
712 :
デフォルトの名無しさん :2010/03/16(火) 13:00:15
さて、class Dataがclass Fileを直接使用するとFileの変更がDataに波及するのだから、 class FileWrapperを作るのが正しいという主張だが、これは誰かに使用されうるクラス 全てについて言えることだ。 class Dataがclass A, B, Cを使用するなら、AWrapper, BWrapper, CWrapperを作れと 言っているに等しい。 さらに言えば、class Data自身も誰かに使用されることが目的のクラスなのだから、 class DataWrapperが必要になるということだ。 つまり、100個のクラスを作るなら、100個のWrapperクラスを作るべきと主張している。 Wrapperクラスが有用な場合はもちろんあるが、これが壮大なたらい回しクラスの 固まりだと誰かに言われたらなんと反論するのだろうか。
>>712 クラスの「ニュアンス」を読み取って、コーダの主観だけを根拠に、ラッパーの必要の無いところは外してほしい(キリッ
>>530 の最後の一文からコイツクッセエエエと思ってたが、やはりキチガイさんでしたな
自分の話が相手に伝わらない原因を相手に求めだす奴にまともな奴は一人も居ない
リファクタリングを知らないのかな。 リファクタリングだと、一行だけprivateメソッドに抽出するなんて普通すぎて、誰も疑問に思わないんだけど。
おっとインドリさんの悪口はそこまでだ。
ここで爆笑した。
>>670 > ここまで物分りが悪い奴ばかりと思ってませんでした。
> (もしかして釣られたのか。)
確かに爆釣成功だけどな。
ごめんなさい出来ない子とは遊ぶなってばっちゃが言ってた ばっちゃありがとう
インドリでググったらやたらタイムリーな記事書いてるな で、こいつがなんなの?
そもそもprivateが何なのか知らなかったんじゃないのかねぇ
privateメソッドって、Cで言うところのファイルスコープのstatic関数のようなものだと 思ってたが、何か違うの?
どっかで見た書き込みだなぁと思ったら
>>542 だった。
>>721 運用による。
private メンバ/メソッドにアクセスしないなら、依然ファイルスコープ static でも構わない。
C の頃から OO 的モジュール分割してたのなら、その解釈でいいと思う。
言葉を額面通りでしか受け取れない人達ばかりですねぇ。 メンドイのでチョイスして回答させてもらいます。 >706 1の「Dataのopenの場合」です。 当たり前の事を書いてるだけのつもりでしたが、改めて説明しますか。 まずData::openを変更するのはどんな時?と言うと、↓です。 (1)Data独自の機能を追加する場合 (2)File::openのシグネチャが変化した場合 ここでまず「File::openの変更時にDataが影響を受けるのを避ける」のに Data::openは役立たない事が分かりますね? そもそもprivateなのだから、Data内に対する役割しか持ち得ませんが。 ではDataに対するData::openの役割は何でしょう? それも「File::open に処理を丸投げするだけのData::open」の役割は? m_pFileの隠蔽は当然あり得ません。 また、m_pFileが隠蔽されていないのですから、File::openの代わりに Data::openを使用する事を強制できません。 使用を強制できないのですから、丸投げするだけのData::openは 将来の拡張に備えるという目的には相応しくありません。 Data::openの役割は、「任意で使用できる」Dataクラス固有の機能を 提供するだけのはずです。 丸投げするだけのData::openに固有の機能などありませんから、 無用の長物としか言えません。
メンドウならもう書かなくて良いのに
>715 漏れが無駄と言ってるのは、「他のクラスの関数に処理を丸投げするだけの関数」です。 ちなみに Proxy や Facade のようなパターンでは例外的にそういった関数が登場すると思いますが、 その場合はアリだとも断ったはずです。(>532) またその場合、問題の関数がprivateなワケがありません。
>>724 もう、あなたが書くべき言葉は「ごめんなさい」の一つしか残されていません。
>>726 あの、↓の実装お願いできませんか?
出来たら本当に凄いことだと思うので。
>File* を外部から渡す構造にしておく、等の条件付ですが発生しない設計にできますよね。
>まぁ open等を作った場合も同じ方法で発生を抑えられますが。
>>724 「では」以降何を言っているのかさっぱりわからないが、それprivate関数であっても、
クラス名が主語になるようなメソッドしか作成してはならない、の説明なのか?
額面通りに受け取って話が通じるような文章にしてくれよ。
あまりにお前が一生懸命に何か言おうとしてるから、何を言いたいのか知りたいんだけど、
大抵何言ってるのかさっぱりわからんのだよ。
それと、もうクラス名の主語たりえろ云々はもうどうでもいいから、
>>728 だけは回答してくれ。
結局、俺様の崇高な文章がわからないお前ら馬鹿という所で思考停止してしまって、 推敲するとか文章読本読むとかするつもりゼロなんだろうなぁ。 ニュアンス読み取れってことは、自分の伝えたいことが伝わってないということで、 それは自分の文章に原因があるってことに気づかないのかね。 プログラマなんだからコードで語れよ。 >File* を外部から渡す構造にしておく、等の条件付ですが発生しない設計にできますよね。 「等の条件」はお前にしか解らないんだから。 コードで示せば一発で相手を理解させることができるのに。
次に◆79cfdX7bxMは 「こまけえこたぁいいんだよ」 と言う
あれ、責務とか結合度とかカプセル化の話はどこいったんだ?
◆79cfdX7bxMにとっては「Dataのメソッドを書き換えるときに、Dataをコンパイルし直さなければいけない事」が一番重要な問題だったんだよ!! もういいだろみんな!!!
>File* を外部から渡す構造にしておく、等の条件付ですが発生しない設計にできますよね。 当たり前の様に言ったコレ 間違いを認めて全面撤回と謝罪をするか、サクっと実コードを示すか 最後にコレだけ頼む
1対他全員の構図になってるのに、めげずに書き込むのは何がそうさせるんだろう? そろそろ自分が間違ってるカモと思い始めてもいい頃なのに。
>>726 だーかーらー、一行をたらい回すprivateメソッドなんて無駄だよねってのはみんなが同意するところで、
オブジェクト指向的に間違ってるのはどこがどう間違ってるのかという話なんだけど。
無知や矛盾や破綻を指摘される度に一応ググってるらしく 段々使ってる語呂が増え、語呂もオブジェクト指向の物になって来てるんだけど 一つも漏らさず全部の単語の用法が致命的に間違ってると言う素晴らしさ 一生改善しない、まさに死ぬまで馬鹿が約束された、馬鹿の中の馬鹿
皆今日も華麗に舞って俺を楽しませてくれ
飽きた
740 :
デフォルトの名無しさん :2010/03/17(水) 11:30:26
もしかして:語彙 プギャ-www
>735 そろそろ気付いて下さい。 ※但し釣りじゃありません。
レッツパリィー!
コードも書けない、負け逃げも嫌 屑
>>741 そろそろ自分で出来るって言ったコード書けよゴミクズ
Cライブラリの関数ポインタ集みたいなクラス作って 何が抽象化だよw
>>741 の名前はクニオ
間違いない
こんなに自分の発言に責任を持たないキチガイは二人と居ない
反例出せば即決なのに。
>>747 お前は出来ると言った
俺は出来ないと考える
悪魔の証明を求めるとか本当に馬鹿だな
どうせ悪魔の証明って言葉自体知らんのだろうけど
>>747 この期に及んで、明らかに不可能な発言すら撤回しないの?本当にごめんなさい出来ないクズだな
出してもいない例に対する反例を出せとかwwwwwwwwwwばかすwwwwwwwww
>>747 おれの理論を使えば誰でも簡単に時間旅行が出来る。
そんなことありえないだって?ならお前が反例だせ。
これ位の馬鹿さを晒しています。
気付いてください。
>>747 どの発言の何の反例を求めてるんだ?
お前の発言はどれもめちゃくちゃでわからんぞ。
>>747 何の反例を求めてるんだか、唐突で全く意味不明。
反論の間違いだとしたら、死ぬほど反論されてお前が無視してるだけだから、スレを読み直して回答しろ。
もう、自分が正し*げ*だという立場表明のほのめかし発言しか出来なくなったようだな。 それでもこのスレを読むのもやめられず、悔しくて発言するのもやめられない。
>>724 > 言葉を額面通りでしか受け取れない人達ばかりですねぇ。
普通の人間なら、額面通りに受け取ってもらえる文章を書こうとするんだが。
>>747 に質問なんだが
Data::open() が固定パスのファイルを開くメソッドで有ったり、インデックスを特定のルールでパスに変換して開くメソッドである場合も
File の派生クラスを用意して役割分担させるべきと考える?
同様に Data::write() がテキストをHEXで書き込むメソッドである場合もその責務を File の派生クラスに負わせるべき?
この考えだと File の派生クラスは Data の完全な下請けクラスになっちゃうけどこれってオブジェクト指向的に正しいの?
>>747 短文にどこまでツッコミ所を込められるかのテストか?www
今日も空気を読まずにカキコ。 Data は DataHolderと書いといた方が分かり易かったかと今更後悔。 ところで念の為に聞いておくけど、↓のような実装もオブジェクト指向的には 全く問題無い、と思っておられる方は居るんでしょうか。 class DataHolder : private File { public: void SaveToFile(){ open(); write(); close(); } };
くだらん話題なんか振らなくていいから、まずお前のすべきことをしろ。
念の為だって、奥様w
> と書いといた方が分かり易かったかと今更後悔 まだこいつ自分が正しいと思ってるのか
マ板のおじゃばってコテを思い出した。
こいつのトリップぐぐったらMoonWolfと一致するな。偶然かもしれないが。
DataHolderみたいなピンとこねぇ名前で、 そういう単位でクラスをつくる奴の気は知れねぇが。 class DataHolder { public: void SaveTo(File f){ f->open(); f->write(); f->close(); } }; みたいになぜしないのか不思議。 流れ読んでなくてすまんが。
>766 まぁ普通はそうします罠。 では質問をちょっと変えて、↓のB〜Eのうち、これは無いだろってのを挙げて下さい。 あと一部は良くて他は駄目と言う場合、できれば何が違うかも挙げて下さい。 ※クラスB〜Eは、Aとは全く役割が異なるクラスとします。 ※Func2〜5は、func1を呼び出す以外の処理も行うとします。 ※クラスA以外のfunc1は、クラスAのfunc1を呼び出すだけとします。 ※コンストラクタやm_pAの初期化処理は割愛。 class A { public: void Func1( ); }; class Awrapper { public: void Func1( ) { m_pA->Func1( ); } private: A* m_pA; }; class B { public: void Func2( ) { m_pA->Func1( ); } private: A* m_pA; }; class C { public: void Func3( ) { Func1( ); } private: void Func1( ) { m_pA->Func1( ); } private: A* m_pA; }; class D : private Awrapper { public: void Func4( ){ Func1( ); } }; class E : private A { public: void Func5( ) { Func1( ); } };
>757 一応Data::openは固有の引数を与えるとかすら無い、 「完全に丸投げ」な関数だから問題としてます。 あとFileの派生クラスがDataの下請けクラスになるのは正しいと思いますが。 Dataがそのクラスに処理を一部委譲してるって事ですよね。 >765 多分トリップの無い様が簡単過ぎるからかと。
>>768 下請けクラスを作成する事がオブジェクト指向的に正しいのか答えてないね
あるクラスの機能を実装するときにこの機能はこのクラスの派生が持つべきだからって理由で下請けクラスを
複数作るのは原理主義過ぎて現場にはそぐわないと思うんだが
>>768 うるせークズ
お前はまずやるべき事をやれ
うわ、こいつこれまでの数々の恥ずかしい勘違いを無かったことにしようとしてるぞ
>>768 > 「完全に丸投げ」な関数だから問題としてます。
問題だから問題です以上の何かは、もう言えないということだな。
private継承を持ち出して、また何か持論を展開しようとしてるみたいだが、まずお前の結論・主張を書け。
つか、まず
>>541 の問題に決着をつけろ。
散々嘘吐いて話逸らして誤魔化し続けた不誠実の極み見たいな馬鹿が まーた論点ずれた問いかけをして誰かに答えてもらえるとでも思ったの?
private継承などという言語specificな話題を持ち出した時点で、オブジェクト指向的な是非とは 離れてしまったということに気づかないのかな。
>>776 だからコイツにとっては
オブジェクト指向=C++の言語仕様
なんだって
本人にとっては何もぶれちゃいないツモリ
ヘッダでprivateメソッドの痕跡が見れるのが
オブジェクト指向的に見て大問題とかいっちゃうブットビ具合
これだからC++は塵言語なんだ マルチパラダイム言語とか「10人の天才の足を引っ張る一人のキチガイ」を大量生産するだけだろ
普通の人間には、ここまで支離滅裂な行動をとる事は、実は難しい。
このスレで、なんとか名誉挽回しないと心の平穏が保てないんだろうなぁ。
あーあー、見苦しいなw
多分今晩にはこの馬鹿の勝利宣言が聞けるな 相手にされなくなってからの勝利宣言ほど惨めな物は無いが いい加減しつこ過ぎるしさっさと勝利宣言して気持ちよく消えてくれ
C++におけるコーディング規約: ・private継承はしない え?やりたい?うるせー馬鹿。うぜー。
>>767 基底クラスと派生クラスの役割と、派生クラスは継承して何をやりたいかを明確にしないと
private継承のことは語れません。
private継承は、それを行うと便利なときのみに使います。
どのような時に便利なのかは、(More?) Effective C++やModern C++ Designに載ってます。
基本的にはprivate継承は、派生クラスのクライアントコードから基底クラスの公開メソッドを隠すために使う。
A-Eが何なのか解らないと答えようがないのは
>>784 と同じ。
そろそろ来るぞー 「誰にも答えられなかったようですね」と言う虚しい勝利宣言がー
OOPの話題をしているかと思ったら、 private継承を混ぜてきたとか(;´Д`) だいたい、privateメソッドに着目してウンタコータラ言い続けるのも不思議。 そんなもんの変更は、クラス内で完結しちゃってるだろうに。
>776,783,784 そこを突っ込むつもりなら、D、Eはこれでも良いです。 class D : public Awrapper { protected: void Func4( ){ Func1( ); } }; class E : public A { protected: void Func5( ) { Func1( ); } }; >785 A〜Eが何なのかは、まず身近なコードでAとBの関係になってるものを探して、 B=C=D=Eとして考えて下さい。 で、B〜Eはありなのかと。 流石にBが論外とか言うのは>771だけだと思いますが。
誰もまともに答えるつもりがなさそうなので質問を変えてみますが、 BのようなコードをC〜Eのように書く(書き直す)のはありでしょうか? 無闇に書き直すのは間違いとかいうのは無しですよ。
もはや誰一人としてどういう観点からありなしを語ってるのかすら分からないだろう こいつは根っこから馬鹿なんだな 余りにも話を伝える能力が無い
答えて欲しいなら問題を書き直してくれ
>>767 では問題として題意が不明瞭な為に回答ができないとの意見が多い
修正点を上げるだけでは読むほうにとって面倒なので問題を作り直して提示するのが筋だ
この馬鹿まだやってるのかよw
幼稚園児の方がまだ話が通じるわ
意味不明で答えようも無い質問を出してるのにコイツは何時になったら気付くの? まともに答えるつもりが無い?質問を変えてみます? 何でコイツはコンナニモ馬鹿なのにコンナニモ上から目線なの?
自分以外の馬鹿が釣れるまで質問し続けて、 決定的な間違いをした奴を叩いて溜飲を下げてから このスレから立ち去る戦法。
>>789 お前が大半のレスを無視した結果がこれだよw
>>789 BをCに書き換えたらそれは
>>541 で、Cはオブジェクト指向的に間違いだという主張じゃなかったのか?
今までさんざん指摘があったのは全部無視か?
>A〜Eが何なのかは、まず身近なコードでAとBの関係になってるものを探して、
いやいや、質問したいなら、お前の身近なコードで具体例を示せよ。
今頑張って馬鹿が釣れそうな問題考えてるから明日の夜まで待ってくれ じゃないの?
◆79cfdX7bxMの汚点まとめ 1.馬鹿 2.不遜 3.尊大 4.横柄 5.論点無視 6.論理飛躍 7.他者批判 8.責任転嫁 9.認知障害 10.有言不実行 11.自意識過剰 12.自制心不足 13.認知的不協和
>>788 にとってはpublic/privateの違いなんて、「ならこれでも良いです」って位の
どーーーーーーーでもいい些事なんだな
オブジェクト指向のオの字すら語る資格が無い
正直ここまでpublic/privateの区別が出来てない奴も珍しい プロジェクトに組み込まれたら災害レベルの無能を発揮するだろう
さあ連休だ。 存分に踊れ。
明らかに間違った事を主張する 2010/03/11(木) ↓ 矛盾点を指摘、質問される ↓ 論点がずれた意味不明な回答をする ↓ 全然解決されなかった矛盾点を再度指摘、質問される ↓ めんどくさいんでスルーしますと言い出す ↓ 全てを無かった事にして意味不明な質問をしだす ↓ 意味不明すぎて誰からも相手にされない ↓ 質問の要点が不明瞭なまま角度だけを変えた意味不明な質問を繰り返す ↓ 意味不明すぎて誰からも相手にされない ←いまここ ↓
この一文にすべてが凝縮されてる。
>>679 > 超ド素人でも感覚で理解してるような原則を延々説明しなきゃならんとか、
ド素人の自分が超ド素人時代に、感覚で理解したと勘違いしたことを延々と垂れ流しているだけ。
何の根拠も理論武装も無い。無いが故に、何故正しい自分がわかってもらえないのかという所
から抜け出せない。
あまつさえ、全員が自分を釣っているのではという疑念を抱く始末。
こんなにはっきり「お前のそれは間違ってる」と言われているのに 「こいつら一から説明しなきゃ分からないのか」と超絶変換される脳みそ持ってる事は、本当にお気の毒だと思う まぁ79cfdX7bxMの脳みそと性格は絶対直らないから早く死ぬといいよ
Money, Employee, Order, Printer, Customer, Movie, Rental, Account, Chargeとかさ、 OOの設計とかリファクタリングとかTDDとか、その手の書籍見たらこんな感じの簡単な 具体例が良く出てくる。 Animal, Dog, Catはもう古いけどさ。 こういう具象クラスを例に挙げないと、会話が進まないよ。 本気で会話したいのかどうか知らないけど。
もう居なくなった 79cfdX7bxM の話は終わりにしないか?
>>504 が発言するまで三ヶ月も放置されてたし、やりたいならとことんやれば?w
class A { public: void Func1( ); }; class B { public: void Func2( ) { m_pA->Func1( ); } private: A* m_pA; }; 元々↑のようになっていたコードを、 class Awrapper { public: void Func1( ) { m_pA->Func1( ); } private: A* m_pA; }; class B : public Awrapper { public: void Func2( ){ Func1( ); } }; あるいは class B : private Awrapper { public: void Func2( ){ Func1( ); } }; と書き直すのはありなんですか?
なし。
>>810 Awrapper を Bsuper に変更すれば問題無いんじゃないの
何か自由度が増えるとか関数ポインタの参照をする依存度が 減るとかメリットあるのか?
>>813 class B と同列に class B' を作るなら class Bsuper から派生させるのは良くある事だと思うけど
俺に聞いてるんじゃなかったかな?
815 :
812 :2010/03/21(日) 01:34:28
少し補足
>>810 の class A を犬、class B を桃太郎として考えてみよう
class Awrapper は犬の機能を抽出したペットというクラスになり、class Bsuper は人って事になるかな
class Pet {
public: void peropero() { m_self->peropero(): }
private: Dog* m_self;
};
ラッパーは継承しないほうが隠蔽度が上がるからこの実装に問題は無いと思う
class Human {
public: void peropero() { m_dog->peropero(); }
private: Dog* m_dog;
};
人のクラスに舐めるメソッドが存在するのは少し変だけど、実装上の都合でこうなるのは有りえる事
原理主義者は怒るだろうけど絶対ダメって話じゃないと思う(無論、異論は認める)
かくしてペット( Awrapper )と人( Bsuper )の実装が舐める(peropero)に関しては同じになってしまったが、
この2クラスの性質は明らかに異なる
>>810 の後半はペットから桃太郎を派生しているからオブジェクト指向的にはダメで、
Awrapper を Bsuper にして、人から桃太郎を派生させる様にすれば問題は無いんじゃなかろうか
>>810 意味ない質問してるの解ってるのかな。
責務とか言ってたの誰だっけ?
818 :
815 :2010/03/21(日) 02:15:19
>>816 いやいや、その前にたとえprivateであっても主語がうんたらかんたらが先だろ
こんなイン○リみたいな奴がイ○ドリ以外に居る事に驚愕を禁じえない それとも、俺が知らないだけでC++界隈にはこの手の馬鹿が多かったりするのか?
イソドリ本人だったりしてな こんなのそうそう出ない上に、その破壊力が強烈だから目立つだけじゃね? ℃odeZineみたいに、ライターとして記事を採用するようなバカやらなきゃ、実被害は出んよ
いや、でもこういう手合いってPGSEには一定割合で存在してるような気もするよ。
だからインドリって何だよ ここで話に挙げたいなら纏めろ
ググればすぐわかるのに
class B : public Awrapper { public: void Func2( ){ Func1( ); } }; あるいは class B : private Awrapper { public: void Func2( ){ Func1( ); } }; と書くのがダメだとしたら、 class B { public: void Func2( ){ Func1( ); } private: void Func1( ) { m_pA->Func1( ); } private: A* m_pA; }; もダメだと思いますがいかがでしょうか。 Awrapper が明示的に抽出されていないだけで、 その役割をBに与えてるのは同じですよね。 まぁこれは原理主義的過ぎる考え方だとは思いますがね。
相手が何か特殊な単語を使うと鸚鵡返しのように次のレスに組み込んでくるな まぁ相変わらずイミフ
賢そうな単語に見えたんで早速真似してみましたって行動パターンが哀れ過ぎる。 そして悉く使い所が間違ってると来ると、もはや涙無しには語れない。
>827-828 特殊な単語ってどれ?
>>826 話がずいぶん変わってきた感じがあるが、直近のレスにコメントすると、
Code1:
class B : public Awrapper {
public: void Func2( ){ Func1( ); }
};
と
Code2:
class B {
public: void Func2( ){ Func1( ); }
private: void Func1( ) { m_pA->Func1( ); }
private: A* m_pA;
};
は同一じゃないだろ。Code1の是非はともかくCode1が駄目だとしてもCode2が駄目だとは言えない。
Code1は、お前が考えてるのとは別の意味で駄目な場合がある(継承の是非的視点)。
Code3:
class B : private Awrapper {
public: void Func2( ){ Func1( ); }
};
これも同様で、Code3の是非とCode2の是非はイコールではない。
なぜイコールだと思うのか、その根拠を書け。
継承という話を持ち出した時点で、is-a関係やs-implemented-in-terms-of関係か どうかという事抜きに話をするのは意味がない。 それら抜きに書き換え可能かどうかと言えば、答えは書き換えられるとしかいいようがなく、 それが無駄なたらい回しかどうかは、その場合もあればそうでない場合もあるとしか言えない。
コンテキスト抜きにClass ABCとかFunc1とか言っても駄目。
なんでコンテキストがしっかりしている
>>541 から逃げるのか。
>>832 もはや反論しようが無いからABCで誤魔化して逃げてる
>>826 > Awrapper が明示的に抽出されていないだけで、
> その役割をBに与えてるのは同じですよね。
まだわかってねーな。
privateメソッドに抽出してもclass Dataの役割は何も変わってないし、カプセル化の度合いも変化なし。
そのこととその抽出したprivateメソッドをクラスに引き上げるのとは全然別。
>830 >なぜイコールだと思うのか、その根拠を書け。 826に書いてある通りです。 Awrapper が明示的に抽出されていないだけで、 Awrapperとしての役割をBに与えてるのは同じですよね。 (役割と言う表現が妥当かは、若干自信がありませんが。) あとCode2は A-B が has-a な関係なのは明らかですから is-a 関係とは言えないと思います。 ※Javaのように多重継承を許さない言語系では、 is-aな関係でも委譲の形で実装する事はあるでしょうが、 その場合 func1 を private にする事はないはず。
何言ってるのかさっぱりわからない。 Code2はhas-a関係でCode1はis-a関係でしょう。
>834 DataとFileから見た両者の関係は? 少なくともData自身から見れば、Fileとの関係について privateかどうかは関係無いと思いますが。
>836 何でCode1とCode2を比べているのですか。 >830が言ってるのはCode2とCode3では。
>>837 DataとFileはデータ結合だっつってんだろカスが
>>838 開いた口がふさがらないとはこのことだな。
>>826 を書き直せば、
「Code1あるいはCode3が駄目だとしたらCode2も駄目である」
と言ってる。
Code1とCode2は同一ではない。Code1はis-a関係でCode2はhas-a関係だ。
別の構造なんだから、Code1の是非とCode2の是非は同一ではない。
Code3はクラスを抽出したということと、private継承下という点でCode2と異なる。
故にCode3の是非とCode2の是非は同一ではない。
Code1、Code2そのものにも問題がある場合があって、それは具象例でなければ語れない。
わかった?
付け加えて言うなら、Code2とCode3はいつでも違うのかというと同じ場合もあって、
それはやはり具象例でなければ語れない。
>>541 のような具象例だと話が早いし、是非も語れる。
そして、
>>541 のコードだったら無駄なたらい回しだよねという結論だが、
オブジェクト指向的に間違いかどうかには決着が付いてない。
完全に実装の是非の話をしているのに、ABCABC繰り返すだけでお話にならん
>841 >Code3はクラスを抽出したということと、private継承下という点でCode2と異なる。 >故にCode3の是非とCode2の是非は同一ではない。 ここを詳しく。 Code3はダメでCode2はOKという例を出してくれればOKです。
1.馬鹿 2.不遜 3.尊大 4.横柄 5.論点無視 6.論理飛躍 8.責任転嫁 9.認知障害 12.自制心不足 13.認知的不協和 今日だけでこれだけ再発
>>844 お前は絶対実例出さないのに人にだけはそんな偉そうな態度で例示させるんだなwww
お前が主張したいのは、Code3は駄目である、なぜならCode2が駄目であるからということだろうが、 そもそもその命題の建て方が間違ってるという指摘なんだが。 何度も言うが、具象例を出せ。
そもそもprivate継承はオブジェクト指向に無い概念だから論外だろ お前は一体何の話がしたいの?
>847 逆。 Code3がダメだからCode2もダメだと言いたい。 あるいはBにAのラッパーとしての性格を持たせるのがナンセンスと言いたい。
>>844 ちゃんと説明しないとわからないか。
Code3が良いなら、それはis-implemented-in-terms-of関係なの(他のprivate継承の
例もある)だから、Code2も良い。
しかし、Code2が良いならいつでもCode3が良いとは言えない。
良い場合もあれば悪い場合もある。(だからCode2が良くてCode3が悪い例を考えても
意味がない)
そして、Code3が悪ければCode2も悪いことにはならない。
>あるいはBにAのラッパーとしての性格を持たせるのがナンセンスと言いたい。 無論 B が A のラッパーであるなら妥当であるけど、その場合↓のように B::func1 は public にするはずですよね。(protectedもあり得るけど) Code4: class B { public: void Func2( ){ Func1( ); } public: void Func1( ) { m_pA->Func1( ); } private: A* m_pA; };
クライアントがclass Dataを使用するという関係と、class Dataとclass Fileの関係を ごっちゃにするなよ。 class Dataが何を保有しようと、privateメソッドに何を持とうと、クライアントには Fileラッパーの性格は見えない。
>>852 それと全く同じ指摘は200〜300レス前からされてる。
その時の返答はヘッダファイルから見えるだった。
あ、これ言っとかなきゃ駄目か。 Code3は良い場合がある。それは、is-implemented-in-terms-of関係の場合だ。 今日はこれにて撤退。
あ、それから具象例というのは具体的なコード+具象クラスのことだからよろしく。
お疲れ様でした
privateで隠せば何やってもOKと言うなら、 大半の問題ケースが許されてしまうと思うんだが。
>>858 クラス設計的な誤りと、それを隠蔽するかどうかと、
>>541 がオブジェクト指向的に
誤りかどうかは別の話。
private継承で実装手段以外の例としては、non-copyable-mixinだな。
class Awrapper { public: void Func1( ) { m_pA->Func1( ); } private: A* m_pA; }; Aという型が実装に使われてるのを隠すんなら、 そんなクラス名は不都合だし、メソッド名も同じになるのも苦痛。 型を継承した関係じゃないのに、 実装にある型の存在を予感させたりするのはブサイク。 上の例は class B {public void foo() {_a->Func1();}}; の形にしないとウマミが無い。 class DecratedA : public A {}; にして継承関係にすれば、 クラス名もメソッド名も自然になる。 コンストラクタでA *を受け取るようにして、 内部でそれに委譲しながら独自処理を行うと、 GoFで言うところのDecoratorパターンになる。 特性を動的に追加したりすることなく、 再帰的に合成することもなくて、 あるインスタンスへの間接的なアクセスを提供するなら、 Proxyパターンとなる。
もうさ、 static A_Func1(); でいいんじゃね?w
>861 >実装にある型の存在を予感させたりするのはブサイク。 A::Func1 へ丸投げするだけの B::Func1 を実装するのも ブサイクと思うんですが。(例えB::Func1がprivateだとしても) それをオブジェクト指向的に云々と表現するのが間違いって言うなら、 単純に漏れが言葉の選択をミスっているという事で納得できますが。
… とりあえず別人証明したいなら協力します、と言っておく。>861 (なんならfusianasanもする。)
俺もなんか ◆79cfdX7bxM が正しいんじゃないかって気がしてきたよ。
あーあ・・・
>>863 > A::Func1 へ丸投げするだけの B::Func1 を実装するのも
実装はさておき、インタフェースとして適切かどうかが最大の関心ごと。
Aのインタフェースとして適切で、BがAを継承しているのなら正しい。
継承していなくてもFunc1がBとして適切なら正しい。
あくまで、実装の話をする前にこの決着をつけておく必要がある。
インタフェースが腐っていたらもう、実装の話なんかしてる場合じゃなくなる。
次に、実装について。一見不要でも、単純に判断できない。
インスタンスへのアクセスを集約しておくことは、後で思いがけず役に立ったりもする。
void B::Func1() {_a->Func1();}は、メソッド内を if (_a && _a->isVisible()) _a->Func1(); とさせたり、
if (hasFocus()) _a->Func1(); else _stderr->puts(_a->inspect()); とさせたりしうる。
丸投げに見えるだけであっても、ある種のささいな拡張性を備えていると言えなくもない。
最後に、そのたらい回しprivateメソッドの名前がFunc1のままでいいかどうか。
俺は良くないと思う。ただ同時に、ピーピー言うほどのものでもないと思う。
privateメソッドはただ単に、クラスの内部で完結しており、表に出はしない。
クラス内で判別が付く名前を適当に使えば十分だと思う。
private void B::Func1() であっても、良くはないが許せる。
>>866 同じ臭いと言われただけでなんですぐ自演に結びつくのかね
>>826 class B {
public: void Func2( ){ Func1( ); }
private: void Func1( ) { m_pA->Func1( ); }
private: A* m_pA;
};
に問題は無い、B::Func1() が何の為に存在するのか理解してないだろ
class B {
public: void Func2( ){ Func1( ); }
private: void Func1( ) { m_pA->Func1( ); }
private: Awrapper* m_pA;
};
なら B::Func1() は冗長だから問題が有るがオブジェクト指向的な理由では無い
>869 >インスタンスへのアクセスを集約しておくことは、後で思いがけず役に立ったりもする。 void B::Func1() {_a->Func1();} と実装したところで、Bの他のメンバが a->Func1(); とFunc1を直接呼び出すのを禁止できないから、 集約するという役割は果たしていないと思うのですが。 >871 >B::Func1() が何の為に存在するのか理解してないだろ 何の為に存在すると言うのですか。
A とか B とか抽象的な名前にした時点で 議論するの意味なくね? File と Data はどこ行った?
> void B::Func1() {_a->Func1();} と実装したところで、Bの他のメンバが
> a->Func1(); とFunc1を直接呼び出すのを禁止できないから、
> 集約するという役割は果たしていないと思うのですが。
もう何なのこの馬鹿
メンバが使う事を制限できないとか言い出したら全てが破綻するだろ
>>872 Awrapperを作ったとしてもAwrapperのメンバがA*に直接アクセスするのを制限できない問題について語れ
875 :
871 :2010/03/21(日) 23:09:24
>>872 >>869 = 874 が書いてるんだけどなぁ
B:Func1() の存在意義は A のラッピング
君がラッパーの存在意義を理解してない事は
>>872 で露呈されたよ
>874 Awrapperは、A*を隠蔽して、Awrapper::Func1の使用を Bのメンバに強制できます。 >875 ですからラッピングしてる対象に直接アクセスできるのですから、 役割を果たしてないじゃないですか。
>>872 「一つのクラス内のメンバすら管理できないクソ共が途轍もなくクセェ」ってだけで、他に何か問題でもあるのか?
>>876 お前正気か?ふざけてんのか?
Awrapperを作ったとしてもAwrapperのメンバがA*に直接アクセスするのを制限できない問題について語れ
千回音読した後死ね
>Awrapperを作ったとしてもAwrapperのメンバがA*に直接アクセスするのを制限できない問題 そんなモノ無い。でおしまい。 そもそも public である Awrapper::Func1 は、自身からA*を隠すのが目的ではありませんよね。 private である B::Func1 との違いを良く考えて下さい。
同次元の話だが
>877 >他に何か問題でもあるのか? ぶっちゃけ言うとそれを見つけるのが漏れの目的。 馬鹿の思索に付き合わせてすまんかった。 とりあえず「単に無駄」の領域を出ませんねこりゃ。 敢えて言うなら、コレに意味があると思う人達が居るのが問題?
十日以上の時を費やして何も得る物が無かったでFAなww 無能すぎwww
>>876 言いたい事は分かるけどね
プロマネが『B::Func1() は A::Func1() のラップ関数ですので将来の事を考えて B のメソッド実装において B::Func1() を使って下さい』
と言ったときに君は『その実装だと A::Func1() の使用を禁じる事ができませんので Awapper を用意すべきです』って返す訳だ
俺がプロマネだったら『帰れ』って言うね
885 :
884 :2010/03/22(月) 01:03:10
>>882 先に負け惜しみ書いて逃げてたのね、気付かずにレスして損した気分
コレって B::Func1() の事か?
完全なラッパー(生メソッドの使用を禁じる事ができる)でなくともラップの目的を果たせるのであれば意味は有るだろ
やはり何故ラップするのかって理由が判ってないんじゃないか?
B:Func1() と Awrapper で実装の手間も変わらないとか言うなよ、それこそ素人の証明になる
>>885 おいもうそっとしておけ
やっと「オブジェクト指向的に問題ある」と言う妄言を撤回したんだから
負け惜しみと言うより全面降伏だな 非常に見苦しかったが、決着はついた。
とりあえずけじめは付けるつもりでトリ付けてるので、貶すなりなんなりどうぞ。 >885 >やはり何故ラップするのかって理由が判ってないんじゃないか? 将来性考えて云々は分かりますが、B::Func1を拡張する時点で 何処で使われているか確認しないと、危険だって事は分かってますか?
>>888 俺たちがお前を貶めているんじゃなくて、お前が勝手に堕ちてってんだろ
悪いこと言わんからもう黙っとき
>>888 拡張って何?
メソッドの機能を後で変更する話ならラップ関数に限定した話では無いよね
話をすり替えてないか?
流石に>885はツッコミ入れておかないとマズイのでは… 下手すると漏れより…
>890
884 名前:デフォルトの名無しさん[sage] 投稿日:2010/03/22(月) 00:26:45
>>876 言いたい事は分かるけどね
プロマネが『B::Func1() は A::Func1() のラップ関数ですので
将来の事を考えて B のメソッド実装において B::Func1() を使って下さい』
~~~~~~~~~~~~~~~~
>>892 やはりラップの意味が判ってないね
『将来の事』というのは『環境の変化』を意味するのはラップの意図を理解していれば明白な事
A社が提供するライブラリ class A を使って何かの機能を実装していました
しかし、何かの理由でX社が提供するライブラリ class X を使用しないとならなくなりました
class A と class X ではインターフェイスも異なります
さて、ラッパーを噛ませないでBのメソッドがAのメソッドを直接コールしていたら修正作業はどうなりますか?
ラッパーを噛ませておいた場合はラッパー部分の修正だけで済みますけどね
後の環境変化に対して修正量を極力少なくするのがラッパーを噛ませる一番の理由だよ
そもそも Awrapper って書き方自体が変なんだよ
ラップは A を隠蔽するモノでは有るけど隠蔽対象が X になったり Y になったりした時に対応する為のもの
だから A が持つ機能で名前を付けるべきなんだよ
例えば WinSockWrapper なら winsock の機能をラップしたクラスとして妥当だけど CScokWrapper って名前にしちゃうと
意味が無いって事だね
まぁ CSock 自体が winsock をラップした様なもんだからこの例えは変だけど良いのが浮かばなかったから勘弁
>893 そのケースも、例えば class B { public: Func2(){ m_pA->Func1(); } private: A*m_pA; }; と組んでいた場合、Awrapperを用意して↑のA*を書き換えれば、 Bの修正は1箇所で済むと思いますが。 (より適切な名前を付けるなら、Aadapterとすべきでしょうか。) しかもこの方法なら、他にAを使っているクラスがあった場合に Awrapperを使い回せます。
>>894 勿論、B 以外のクラスでも A の機能を利用したい場合ならラッパークラスを作成するのは当然
B::Func1() はもっと手軽にラップを実現しようとした例で、もし B 以外のクラスも A を利用するならタコ実装だ
完全なラップ手法をとらなくとも用が足りてれば何の問題も無い
B::Func1() に意味が有ると言うのはそういう意味だ、いい加減に理解してくれ
今までの流れから、話の前提として在るのは「BがAを使う上でB独自の拡張を強制するためにAwrapperを作るか否か」なのに Awrapperを他のクラスで使いまわすとか言い出すのはタコ過ぎるだろw
>>895-896 の書いたことは、いつもどおり通じないと思う…。
もう
>>894 には何も通じないとおもわれ。
Bのprivateメンバ変数を、Bがどう使うか、
BがBの都合によりどう呼び出すかは、
Bが決めることだから、
Bが用意した自分のためのprivateメソッドを、
Bが自分のために使うことは正常。
privateメソッドすら用意しなかった場合のことを考えると、
そのメリットが分かる。クラス実装上の保守性を高めている。
>>893 > そもそも Awrapper って書き方自体が変なんだよ
おれもそっちが気になる。
オブジェクト指向的に、っていうんなら、
クラス内部の実装のためのprivateメソッドがどうかというよりも、
Awrapperなんていうクラスを作ってしまうことが不気味。
おまえらクズだな
>>897 ラッパーって言葉は知ってたけど、その目的や存在意義を知らなかっただけでしょ
慌てて
>>894 で見当違いなレスしてきたけど、今まで書いてきた事と整合性が取れてないよ
Awrapper から B を派生するのと B がラップメソッドを持つのを比較してたりしてたんだから
そして沈黙だし...
現場を知らない学生さんと見てるけど皆さんはどう思う?
なんという衝撃的な結末。 まさか折れるとは思わなかった。
>>880 > void B::Func1() {_a->Func1();} と実装したところで、Bの他のメンバが
> a->Func1(); とFunc1を直接呼び出すのを禁止できないから、
> 集約するという役割は果たしていないと思うのですが。
イコール
折角Awrapperを実装したのに、タコ男君はBのメンバを実装中にAwrapperを無視してAへ直接アクセスしてしまいました。
これではアクセスをAwrapperに集約するという役割が果せていません。
このタコ男君にAwrapperの使用を強制するにはどうすれば良いのでしょうか??
結論
タコ男君、明日から来なくていいよ。
別にもう来るなとは言わないけどね
>>541 で『こーいうのが無駄だと言いたい』ではなく『何故こーいうのが必要なんですか』ってスタンスだったら
皆優しく接してたはずだろう
なんで
>>541 みたいな書き方しかできないんだろうって思うよ
誰かが書いてたけど御免なさいって言えないのも悲しいし
またこのスレ閑散としちゃうのん・・・ なんだかんだで楽しかったのに
あの発言は間違ってましたごめんなさい じゃ無く 発言は撤回しないけどキミらが貶したいなら勝手にすれば?(訳注:俺から見るとキミらの発言は「貶し」でしかないの意) いやまてそんなことより実は○○の方が俺より酷くないか?(訳注:やっぱり俺だけ叩かれるのはイヤだの意) だもんなw これが釣りでも一字一句意識した煽りでもないんだとしたら、本当に屑野郎としか言いようが無い
もうあとは↑みたいな何の実もない書き込みだけが続きます。
祭りは終わったんだよ…
実は沢山なってたのに 一つも口にする事が無かった◆79cfdX7bxM 合掌
ここからは底辺PG名物の「人格否定」による戦犯嬲りが初まるよ!
911 :
デフォルトの名無しさん :2010/03/22(月) 11:12:03
最後に ◆79cfdX7bxM がインドリさんなのかだけ教えてもらえないでしょうか。
> ◆79cfdX7bxM がインドリさんなのか 流石に違うと思われ インドリは、異論・指摘のある者全てをアラシ認定して暴れるから 奴のブログや、CodeZineでの並列処理関係の連載のコメント欄見れば分かる いや、だからといって見る事はオススメしないけど
インドリさんは他のブログまで乗りこんでくるからな。
限界以上に簡素にしようとして、元から同じ認識を持つ人間にしか理解出来ない無意味な糞文になってるが 別に言ってる事は、まともじゃね? ↑のURLしか見てないが ◆79cfdX7bxM=インドリと言ってる奴は相当の節穴 技術レベルが園児と高校生位は差があるっつの インドリ憎しで汚物を撒き散らすな
知識レベルでは差があるかもしれないが技術レベルでは似たようなもんだと思いました。
>>915 どっちが園児でどっちが高校生?
いや、素で・・・
パイソンの人はインデント議論なんてしないのかな? 聞いた話によるとパイソンのインデントはアレなようで。
>>914 ざっと読んだけど(目がちかちかする)、コメント欄でかみついてる方が何言ってるのかわからない。
並列処理で起こりうる問題点を話してるのに、グローバル変数をローカル変数に持って行ったら、
グローバルで参照しているところがみれなくなるとか、なにそれな指摘。
インドリという奴がどのコミュニティでどれだけ有名なのか、あるいは全く無名なのか知らないけど、
気に入らないならそこで叩けよ。
>895,897 コードの不完全さを、運用でカバーするというスタンスはどうかと思いますよ。 他に方法が無いならともかく。 >896 >Awrapperを他のクラスで使いまわすとか言い出すのはタコ過ぎるだろw 使い回せるってのは>893が挙げた、AがXに変わった場合のケースですよ。 個々のクラスにラップ関数用意するのは、むしろ仕事増やしてるだけでしょうに。 クラス数×関数の数だけ修正が必要って事分かってますか? >899 >そして沈黙だし... メーカー系勤務なので今日も出勤です。 >901 >タコ男君、明日から来なくていいよ。 むしろこちらから願い下げです。
相変わらずのブッチギリ馬鹿で安心した
DLLでは明示的に公開クラスに指定しないと使えないけど、誰もそういう話してない? ラッパーの話になってから、両者ともすげー読みづらいので読む気大幅ダウン。 Unix/Linuxのsoだとどうなのかな?
誰もそんな話はしてないな
>>920 いい加減自分に都合の良い前提を暗黙的に出したり引っ込めたりするのを止めろ
何時Awrapperは複数のクラスから参照される事になった
ぶっちゃけ、
>>869 以降、◆79cfdX7bxMの方が正しげな気がする。
◆79cfdX7bxMの相手をしてる方が何を主張したいのか良く解らない。
>>925 主張すべきものは何も持ってないのであまり触らないであげて下さい。
>>861 ががんばってんのかな。
>>861 が何を言いたいのか良くわからん。
derrivedという単語も知らんのかいな的な疑念もあるしw
derived?
>>521 >>541 あたりの
privateであっても主語なんたらかんたらオブジェクト指向的に間違ってるなんたらかんたらを撤回させたいだけなんだがな。
>>920 >>882 で撤回したと受け取っていいの?
凄い勢いの言い訳で撤回してるか微妙。
>敢えて言うなら、コレに意味があると思う人達が居るのが問題?
一応突っ込んでおくが、そんな奴居ないから。
お前のオブジェクト指向絡みの糞解釈を否定してるだけで誰一人その糞例を肯定していない。
AWrapperを作るって、例えば生Winsock APIをラップするclass Socketを作りましたって事のメタファーじゃないの?
privateメンバ変数へのアクセスを、必ずsetter/getter経由で行う流儀の人たちがいるんだけど どうなんだろ的な話題を振ってみたりして。
読み辛いと言う事なので書き直してみますか。 class B { public: void Func2(){ Func1(); } private: void Func1(){ m_pA->Func1(); } private: A*m_pA; }; このようなコードにおいて、Func1() の存在意義として A* が X* に変わった場合に、Func1()で吸収できると >893は申し上げました。要はこうできると言いたいのでしょう。 class B { public: void Func2(){ Func1(); } private: void Func1(){ m_pX->Func3(); } private: X* m_pX; }; ですが、B::Func1など用意しておかなくても、 ↓のよにすれば良いはずです。 class B { public: void Func2(){ Func1(); } private: void Func1(){ m_pA->Func1(); } private: XA* m_pA; }; class XA { public: void Func1(){ m_pX->Func3(); } private: X* m_pX; }; この方法であればB以外のクラスでもA*を使っていた場合に XAを使い回せる(他のクラスもA*をXA*に書き換えるだけで済む)はずです。 更にBが外部からAを受け取る形で実装されている場合、 XAをAから派生させて作ればもっと手間が減らせます。
>>933 AWrapperという名前がおかしいという指摘に対する感想ね。
>>934 マルチスレッドのデバッグでログ入れたりするから普通にアリ。完。
>933 ↓に注目。 >521 >どうしてもラッピングしたいなら、Mogeのエイリアスとなるクラスを用意して、 >そのクラスを使ってやるべき。
>>937 デバッグログなんか入れたら、予定外のコンテキストスイッチが起こるんじゃないか?
>>938 お前には文脈と言う概念が無いんだな。
元々Hogeクラス一つのprivateメソッドで用が足りるはずの物に対しての話だろ。
何時Hoge1,Hoge2,Hoge3が現れてそれらがfunc()の中でMogeにアクセスする話になった?
アンカしろ。
>>940 予定外のコンテキストスイッチとか言ってる時点でマルチスレッドプログラミングする資格無しw
>>938 class Socketを作るという方法でラッパークラスを作るというのは間違ってないのよ。
誰もそれが間違いだなんて言ってない。
問題になってるのは、privateメソッドでopen()を呼ぶのがオブジェクト指向的に間違いという主張。
ラッパー云々はどうでもいいけど、 > 問題になってるのは、privateメソッドでopen()を呼ぶのがオブジェクト指向的に間違いという主張。 ここだけ取り下げるのか取り下げないのか明確にしてくれ。
別に発生しても問題ないと思うけど。
動きかわって論理的なバグが出るなら直さなきゃならないものだし。
>>942 パフォーマンスとかの問題はあると思うけど。
デバッグログ入りだと発生しないバグというのもありそうな気がするが、まぁどうでもいい。 setter/getter使う派は、マルチスレッドなんて関係ない文脈での話ね。
>>946 そうだ、この変数の変更はイベントにしようって経験が多数あっただけだろ
>943-944 「オブジェクト指向的に」は既に取り下げました。 「privateメソッドでopen()を呼ぶのは間違い」は 「間違い」を「好ましくない」に改めます。
>>948 不覚にも涙が出そうになったよw
議論途中での間違いとかはもうどうでもいい。
俺も抜ける。
>>949 じゃあ逆にsetter/getterを使う事の問題は?パフォーマンス上の理由以外で
>>946 ビジネスロジックの「心底ウザい条件チェック」と「心底ウザい条件変更の多発」を経験してると、何だってsetter/getter経由にしたくなる
いまさら噛み付いてる奴も結構どっか問題ある連中なんだなと思う。
完全に話が終わって次の話題に移りかけてる所で蒸し返す奴も以下無限ループ
結局スレチな話題で半分埋まっちまったなぁ
何ヶ月もレスが無かったスレが言える台詞じゃないわな と思ったが3年の歴史のあるスレがこの終り方はちょっと可哀想だわwww
ごめんなさいw
このスレ2007年からなのか・・・ インデントはタブかスペースかなんてなんか長閑な話題でスタートしてたんだな。
終わりよければ全て良し。
>>951 無駄なたらい回し、ってことじゃないの?本人じゃないから真意はわからんけど。
これだからオブジェクト指向って役に立たないよな。
馬鹿の助けにはならないよね
>>951 コードが読みづらくなる。
つか、お前全部アクセッサ経由にしてるのか?
プロパティと言うステッキーな機構があるからぜんぜん読み辛くならんし
どちらも想定している言語の明示と、>934からの流れの確認をしないと 齟齬が生じると思うのだけど。 個人的にはプロパティのある言語(LLやC#)ならともかく、 C++やJava(6.x系まで)では微妙な気がする。
C++ならお得意のマクロでも使えば
プロパティなら30秒もあればアクセッサ経由に書換え可能だから、どうでもいい問題だな
コーディングの話ではなく設計の話だが、 設計から導かれる setter/getter は 良い setter/getter。 実装から導かれる setter/getter は 悪い setter/getter。
ちょっと意味が分からん
970 :
934 :2010/03/23(火) 11:21:23
悪い、C++での話ね。 俺的にはいいも悪いも評価保留中だけど、それってどうなの的な話題ふり。 この議論は『Smalltalk Best Practice Patterns』が初出らしいんだけど、Smalltalk固有の 何かが関係しているのかどうかは不明。 ただ、俺が読んだ話(何で読んだかは忘れた)では、C++でprivateメンバ変数を 必ずアクセッサ経由で呼ぶという流派があって、その理由の一つは継承先で getterを遅延評価に変えたりする可能性があるかららしい。 俺としては、そういう流派の人がもしいたら理由を聞きたい的なレベル。
971 :
934 :2010/03/23(火) 11:22:31
つまり、コーディング規約で、privateメンバ変数にアクセスするときは、必ずアクセッサ経由にすること、 みたいな規約だったらどう思う?的なこと。
どうでもいい
的的うるせーよ
いいんじゃないの? 今時のコンパイラなら空のアクセサを直接アクセスへのコード展開ぐらいしてくれるだろうし。
アクセッサなら良くて
>>541 なら駄目というのはこれいかに。
アクセッサというからには、少なくともprotectedだろ。そこが
>>541 とは違う。
>>970 > その理由の一つは継承先で
> getterを遅延評価に変えたりする可能性があるかららしい。
サブクラスがスーパークラスの getter に変更を加えるってピンと来ないな
privateメンバの getter でしょ、protectedメンバじゃなくて
> サブクラスがスーパークラスの getter に変更を加えるってピンと来ないな フツーにオーバーライドでは? > privateメンバの getter でしょ、protectedメンバじゃなくて えっ?
>>977 privateのsetter/getterって誰がアクセスするの?
はてしなく、どうでもいい話題。 アホを釣り上げて叩こうって意図?
public メンバ変数は必ず private のバッキングストア作ってアクセサ作れ そしてクラス内でバッキングストアにアクセスするときもアクセサ使え、 って主張とちゃうの?是非はともかく。 1) class Person { public int age; // アクセサなんぞいらんわ void aging() { age++; } } 2) class Person { private int age; public int getAge() { return age; } public void setAge(int age){ this.age = age; } public aging() { age++; } // private にアクセサ使うとか・・・ } 3) class Person { private int age; public int getAge() { return age; } public void setAge(int age){ this.age = age; } public aging() { setAge(getAge() + 1); } // 継承対策っすよ }
982 :
934 :2010/03/23(火) 18:04:48
>>981 全てのprivateメンバ変数に対するアクセスもsetter/getterを経由しろってのは、
Personの例でいえばこんな感じ。
class Person {
public:
void setName(const char* name) {
if (ミドルネームが存在したら) {
// isMiddleNameExist = true; こうはせずに
setIsMiddleNameExist(true); // こうしろ
}
}
protected:
virtual void setIsMiddleNameExist(bool b) {
isMiddleNameExist = b;
}
private:
bool isMiddleNameExist;
}
983 :
934 :2010/03/23(火) 18:05:57
>>981 の3)に付け加えて、publicで公開しないものも含めてって意味。
継承先で書き換えを期待してるかしてないか、または クラス内でもフィールドの仕様が安定してないとかで変わるんじゃないの? virtual 付けてたり、final みたいなオーバーライド禁止付けたりしないんであれば アクセサ経由じゃないとオーバーライドの内容次第じゃおかしなことになるんじゃない?
お客様が仕様ですの中で暮らしているか 仕様は仕様の中で暮らしているかの違い
ひょっとして、みんなprivateメンバまできっちり設計とかしてんの?
↑しても意味が無いから変更に強いコーディングスタイルにしたいんだろ それはもう手間の面でしか判断できん
>>984 virtual付けないとオーバーライドできないけど?
前スレ二個も、いったい何を議論してんだろうか。 次スレいるのか?
要らないかな
3年間続いたこのスレに黙祷
終焉記念パピコ
>>988 だから、「virtual 付けてたり」「finalみたいなオーバライド禁止尽けたりしないん」であれば
オーバーライドの内容次第でおかしくなるだろってこと。
virtual付けてなければオーバーライド出来ないんだからおかしくならないのでは?
>>994 だから、「virtual”付けてたり”」「finalみたいなオーバライド禁止尽けたりしないん」であれば
オーバーライドの内容次第でおかしくなるだろってこと。
オーバーライドの内容次第でおかしくなるか? privateメンバだぞ?
protected、public なアクセサの話だぞ?
>>981 >>982 みれ
何ぞこのアホな幕引きは・・・
> アクセサ経由じゃないとオーバーライドの内容次第じゃおかしなことになるんじゃない? 要するに何が言いたいんだろう? オーバーライドしようがしまいが、アクセッサ経由でしかアクセスできないだろ。
最後は激烈馬鹿で終了。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。