トップページ⇒tech
1001コメント438KB

-OOP限定-プログラム設計相談室

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2005/09/24(土) 16:35:59
全部publicでいいじゃん!ってならないようにするスレです。
0561デフォルトの名無しさん2011/07/01(金) 13:03:27.00
>BrigteってBridgeパターンの事?
間違えたすまない。
0562デフォルトの名無しさん2011/07/02(土) 23:37:05.08
カプセル化の説明ってあとで実装を変えられるとか微妙なのが多くない?
まぁ、たしかにそりゃそうなんだけど、元を辿るとオーバーライドできないからって事なんだよな。
そこに言及した話がない。

int getUnitCost()
{
return Math.parseInt(arguments["unit.count"]);
}

public int unitCount;みたいに親クラスで公開されてると↑みたいなコードに
オーバーライドできん。なぜプロパティが許されるかってのもそこなんだよな。

※ただ個人的にgetter/setterは糞だと思ってる。
0563天使 ◆uL5esZLBSE 2011/07/03(日) 00:39:52.37
>>554
∨∨∨∨∨∨
>>>>>>>>>>>>> 実装レイヤーよりもうちょっと上の話か。難しいな。 <<<<<<<<<<<<<(キリッッッッ!!!!きリッ!!
∧∧∧∧∧∧∧(キリッ!キリ
∨∨∨∨∨∨∨∨∨
>>>>>>>>>>>>>> リアルで会話してると抽象的な会話は誤動作や副作用を生みやすいが、まー、いったん実装すればそれでいいからなー。 <<<<<<<<<<<<<<(キリッッッきリッッッッッ!!!!
∧∧∧∧(キリ!
ゴミ量産機
0564天使 ◆uL5esZLBSE 2011/07/03(日) 10:58:16.55
きも
0565デフォルトの名無しさん2011/07/03(日) 19:54:31.14
>>562
>オーバーライドできないから
違うよ
抽象メンバやインターフェイスメンバとして宣言されたオーバーライド前提のものならともかく、
オーバーライドされることが想定されてないアクセサを正しくオーバーライドするなんてまず無理
できたとしてもスーパークラスの実装にべったり依存した形になるからカプセル化を破ることになる
0566デフォルトの名無しさん2011/07/03(日) 20:09:34.66
>>565 惜しいな。最初からインターフェースありきで設計すればいいんだよ。
スーパークラスはどうしても拡張が必要だとか余程のことがない限り使わないようにする。
別にスーパークラスが存在しても構わないけど、基本的にインターフェースに束縛して使用する。
0567デフォルトの名無しさん2011/07/03(日) 20:19:05.01
>>565
直接オーバーライドせず>>560みたいにすればいい。
0568デフォルトの名無しさん2011/07/03(日) 20:51:48.30
>>566
それが徹底できるなら理想かもしれないが、問題はインターフェイスで宣言するかどうかじゃなくて、
クラスを実装するときにプロパティがオーバーライドされる可能性を想定しているかどうかだよ。
>>562のようにスーパークラスのgetUnitCostを呼び出さないオーバーライドを許すなら、
当然スーパークラス内でgetUnitCostの後ろのフィールドには直接アクセスしてはいけないし
スーパークラスで前提としてるgetUnitCostの細かい振る舞いについて仕様を決めなきゃいけない場合もある。
ですべてのプロパティについてそこまで考えてるのかって話
0569デフォルトの名無しさん2011/07/03(日) 21:13:59.03
>>568

>>562書いたの俺だけど、あれはインターフェースのオーバーライド前提に書いたよ。
スーパークラスはオーバーライドしづらいから、初めから継承する事を前提にしてないよ。
0570デフォルトの名無しさん2011/07/04(月) 00:26:30.38
じゃあ宣言が非抽象のプロパティは無意味ってこと?
オーバーライドされることを想定していなくて非抽象なプロパティも一般的には多く使われてるのは事実なんだから
アクセサ使う目的を一般的に説明するなら、やっぱりあとで実装を変えられるようにするためでしょ。
多態使うのは元を辿ると実装を変えたいからだと言うならわかるが、逆は不自然じゃないか?
0571デフォルトの名無しさん2011/07/04(月) 00:55:39.43
それは、間違いではないと想うよ。ただ2つある側面の片側でしか無いと思うし、そっちばかり強調してんのが今のプログラミング説明だと想う。

あと、すごく個人的な意見だけど getter/setter とプロパティは嫌い。正直意味ないと思う。
もともとIDEでGUIの値を簡単に変えられるようにした枠組みだもん。
Delphi、VB、Java beanとね。JavaやC++に長らくプロパティが存在しなかった原因は、
ホンというとSmalltalkで確立したオブジェクト指向に反してるからだと思う。
例えば、
interface RGB
{
       void change(double red,double green,double blue);
       void change(int rgb);
       void to(RGB rgb);
}
っていうインターフェース用意しておけば、相互でchange呼び出せば済む話だし。
0572デフォルトの名無しさん2011/07/04(月) 09:34:16.87
久々に同意。
Javaなんかはまだ可愛げがあるが、
C#でプロパティ用意しちゃってるあたりで、
もうたまらない。インタフェースというより、
構造体的に扱う事を強いてる。

設計段階で悪いほうに導いてるように見える。
0573デフォルトの名無しさん2011/07/04(月) 09:49:51.41
プロパティはアクセッサにフックかけるみたいなAOP的な使い方するのには向いてると思う
0574デフォルトの名無しさん2011/07/04(月) 20:47:47.11
PropertyDescriptorとAttributeでメタプログラミングするのが.NET流のフレームワークで、
プロパティは.NET Frameworkに不可欠な概念なんだからそこに文句を付けるのはナンセンス
0575デフォルトの名無しさん2011/07/04(月) 20:59:41.22
Javaだろうとプロパティのある言語だろうと、実装変えるためのアクセサは現実に非常によく使われてるんだから
非常に頻繁に利用され、決まりきってて、有効性もわかってるパターンは
言語に組み込んで統一するっていうのは当然の進化だろう
何を言おうが「現実に使われてる」わけで、バラバラに各自のルールでやってるよりはずっとマシ
0576デフォルトの名無しさん2011/07/04(月) 21:36:14.05
「プログラミング.NetFramework」っつー本で
プロパティはイヤ、プロパティ嫌い、と繰り返しててワロタw
0577デフォルトの名無しさん2011/07/04(月) 22:04:56.46
>>571をちょっと弄るが
interface RGB
{
       void change(double red,double green,double blue);
       void change(int rgb);
       RGB to(RGB rgb);//引数で取ったオブジェクトが帰る。
}

こういうインターフェース面白いよね。
void change(RGB source)
{
       RGB fillter = source;

       fillter = fillter.To( new NegativePositive() );//ネガポジ
       fillter = fillter.To( new Edge(0.9) );//強調
       fillter = fillter.To( new Sepia() );//セピア
       fillter.To( this.color ); //最終結果をメンバーへ
}
フィルター化して幾らでも機能を拡張できる。
アクセサ中心でこういうの書こうとするとホント汚くなる。
0578デフォルトの名無しさん2011/07/04(月) 22:08:15.34
別にプロパティだけで実装しろとはだれも言ってないだろ
0579 忍法帖【Lv=8,xxxP】 2011/07/04(月) 22:29:41.67
   ∧_∧    / ̄ ̄ ̄ ̄ ̄
    (ω・ )ゝ < 聞こえない
  ノ/  /     \_____
  ノ ̄ゝ
0580デフォルトの名無しさん2011/07/04(月) 22:32:26.56
>>577って具体的なデータ構造を暈してるけど、RGBにはゲッターが無いから結局何もできない妄想だよ
0581デフォルトの名無しさん2011/07/04(月) 22:39:40.30
>>580
ゲッターなんていらない。
受け取り側がRGBインターフェースを実装するか、
RGBを実装したアダプターを作ればいいだけ。
ゲッターが必須と考えるのは思慮が浅い。
0582デフォルトの名無しさん2011/07/04(月) 22:56:49.62
メンバ変数ありきのクラス設計、
セッタゲッタありきのクラス設計。
いただけない。

オブジェクト指向 != データ指向

カプセル化でインタフェースを突き詰めると、
そんなにプロパティ公開すべきもんでもないと気づく。
0583デフォルトの名無しさん2011/07/04(月) 23:02:41.12
で、何が問題なわけ?
オブジェクト指向の教義に反するとかコードが汚いとか俺が気に入らないとかじゃなくて具体的な問題点を挙げてよ
0584デフォルトの名無しさん2011/07/04(月) 23:03:59.45
>>580
実装は自由だからどうとでもなるよ。

class PixelDevice implements RGB
{
       private Graphics device;
       public PixelDevice(Graphics device)
       {
             this.device = deveice;
       }
       public void drawLine(int x1,int y1,int x2,int y2)
       {
             device.drawLine( x1, y1, x2, y2 );
       }
       public void change(double red,double green,double blue)
       {
             device.setColor( new Color(0xFF * red,0xFF * green,0xFF * blue) );
       }
       public void change(int rgb){省略}
       public RGB to(RGB rgb){省略}
}
0585デフォルトの名無しさん2011/07/04(月) 23:06:06.66
>>584
要らんもの書いてないでchangeとtoを書けよ
0586デフォルトの名無しさん2011/07/04(月) 23:06:43.73
>>571の
>相互でchange呼び出せば済む
これがよく分からん
インスタンスAとBがあってAをBと同じ色にしたい場合はどうやってやるの?
0587デフォルトの名無しさん2011/07/04(月) 23:11:01.95
>>583 同じ値が複数存在するところじゃね。
例えば、getter,setterを排除した>>577だと、
同じ値は、基本的にオブジェクトの中に留まる。
(まぁ、同じ値でコンストラクタ呼べば作れるけどそれは別問題)
別のオブジェクトに引き渡され場合、
引き渡した先のオブジェクトがファイルやデバイスで無い限り変更される。
同じ値はオブジェクト間を右から左へ渡されることがない。
つまり実装が極めて隠蔽される。
でも、getterで取れる値は、setterに入れた値と大抵同一。
実装が外にはみ出してると言われ手も文句は言えないよね。
0588デフォルトの名無しさん2011/07/04(月) 23:19:50.59
ネーミングセンスがクソだから何も伝わらない
素直に名前を付ければinterface RgbReceiver{ void ReceiveRgb(...); }ぐらいが適切だろ
でもそれにToが必要とは思えない

あと同じ値が〜とか言ってるけど、複数のインスタンスの値を集約する場合はどうなるんだよ
受け取り用インターフェイスを複数定義してプライベート変数使うの?
それとも処理フローに沿って別のクラス&インスタンスを量産するの?
0589デフォルトの名無しさん2011/07/04(月) 23:22:38.65
>>585
changeは書いたろ。
まぁ、デバイスの場合toは要らんけどな。
あのインターフェースはtoを分離したほうがいいでしょ。
ちなみに、toを使うフィルターの場合は、
こんな感じ。

class NegativePositive implements RGB
{
       private int rgb;
       public NegativePositive(){}
       public void change(double red,double green,double blue){省略}
       public void change(int rgb)
       {
                rgb  = 0xFF - ( 0xFF & rgb );
                rgb |= 0xFF00 - ( 0xFF00 & rgb );
                rgb |= 0xFF0000 - ( 0xFF0000 & rgb );
       }
       public RGB to(RGB color)
       {
                color.change(rgb);
                return color;
       }
}

0590デフォルトの名無しさん2011/07/04(月) 23:24:38.00
>>588
オブジェクトはメッセージを受け取るものなのに、Receiverって・・・。
0591デフォルトの名無しさん2011/07/04(月) 23:45:43.21
>>588
>受け取り用インターフェイスを複数定義してプライベート変数使うの?
いってる意味がよくわかんないけどこんな感じ。

interface Vertex
{
       void move(Point point);
       void change(Color color);
       Vertex to(Vertex vertex);
}
含まれる要素がいくら増えようと、結局処理と処理結果で成り立つから、
おんなじパターンを淡々と作っていけば済むよ。見慣れてないと、
どこかで値を取れなくなりそうでgetterを作りたい不安にかられるかもしれないけど、
割と堅実に破綻はしないんだよ。
0592デフォルトの名無しさん2011/07/05(火) 00:05:45.18
toの中ってさ書き換えてみると、
public RGB to(RGB color)
{
color.setRGB(getRGB());
return color;
}
ってやってる感じに近いんだ。
これによってgetRGBが公開されるのを防いでる。
本当にgetRGBが存在するとは限らないからね。
特にtoの所属するオブジェクトが外部からの入力関係だとね。

あと、setRGBってここでは書いたけど、
実際はsetterとは全然違うんでsetRGBとは書いちゃいけない。
setterと違って引数のcolorがtoの所属する値を持つ可能性はまず無いから。
0593デフォルトの名無しさん2011/07/05(火) 00:08:20.42
間違えた
× setterと違って引数のcolorがtoの所属する値を持つ可能性はまず無いから。
○ setterと違って引数のcolorがtoの所属するオブジェクトと同じ値を持つ可能性はまず無いから。
0594デフォルトの名無しさん2011/07/05(火) 00:21:50.91
えーと、changeとかtoの壊滅的な英語センスは置いとくとして、そもそもゲッター/セッターが必要かどうかって話ですよねぇ?
なんかColorとかPointとか未定義の型が出てきたんですけど、こいつの値はどうやって取得するの?
フィールドがパブリックになってんの?
0595デフォルトの名無しさん2011/07/05(火) 00:25:56.29
Hoge get_hoge() { return m_hoge; } void set_hoge(Hoge x) { m_hoge = x; }みたいな馬鹿なもの書くぐらいなら
単なる複数の型の直積、直和の意味しか持たない型はパブリックフィールドでいいと思うけどね
0596デフォルトの名無しさん2011/07/05(火) 00:27:31.94
>>594
同じ形式のインターフェースをもってればいいでしょ。
簡単な話しじゃん。

interface Point
{
       void move(double x,double y);
       Point to(Point point);
}
interface Color
{
       void change(RGB color);
       void change(HSV color);//HSVも同様。
       Color to(Color point);
}
0597デフォルトの名無しさん2011/07/05(火) 00:33:23.46
ColorにXYZ系のchangeをあとで追加したくなったらどうするの?
インターフェイスに追加はできないよね
0598デフォルトの名無しさん2011/07/05(火) 00:34:36.97
ちなみにPointとかVectorをこの形式で作ってるとけっこう面白いよ。
Pointの(0,0)地点ってどの空間に所属してるかで実際は変わってくる。
move(1,1)が呼び出されたPointがどの空間に所属し、どういう体系で座標系を
持ってるかで、move(1,1)が呼び出されたオブジェクトが持つオブジェクトの座標は全然変わってくる。
0599デフォルトの名無しさん2011/07/05(火) 00:39:04.35
>>597 >>591の様な感じじゃ無いんだね?

インターフェースの機能追加自体はあり得るよ。本当に必要ならね。
最初に、既存のクラス設計と同じように最小限の最大公約数を目指して用意するんだけどね。
#最小限の最大公約数って変ねぇ。
0600デフォルトの名無しさん2011/07/05(火) 00:45:03.16
あと、本当にColorへの追加が必要かは考えなくちゃね。
例えば >>589 の様に実装するクラスが持ってれば十分な事もあるし、
XYZ系というように構造が違うならXYZ系用のインターフェースをColorとは
別途もてば十分かもしれないしね。
06016002011/07/05(火) 00:46:30.25
>>589 じゃなかった >>584 ね。
0602デフォルトの名無しさん2011/07/05(火) 00:49:06.42
任意のベクトルに対する差分ベクトルに変換する変換クラス用意したらいいだけじゃん
なんでもかんでも一つのクラスに詰め込むなよ
0603デフォルトの名無しさん2011/07/05(火) 00:52:34.82
>>600
単なる値クラスなら、HSVだろうとXYZだろうとColorクラスへのメンバ追加だけで対応できるよね
それについてはどう思う?
0604デフォルトの名無しさん2011/07/05(火) 00:54:40.70
1つのクラスに詰め込んでるつもりは無いんだけどねぇ。あくまでインターフェースだから。
同実装するかは、クラス次第だし。

>任意のベクトルに対する差分ベクトルに変換する変換クラス用意したらいいだけじゃん
>なんでもかんでも一つのクラスに詰め込むなよ
一応聞くけどなんで?というかどういう経緯でそう思うの?
0605デフォルトの名無しさん2011/07/05(火) 00:57:45.18
>>603
そのColorクラスは閉じてるんだよね。
こっちの場合は、必要なだけインターフェースとクラスを増やせば
元を弄る必要なくなるから楽なんだよ。>>577みたいな感じでね。
0606デフォルトの名無しさん2011/07/05(火) 01:09:26.73
RGBとHSVだと前書いたtoの分離でもうすこし面白いことができる。
HSVからRGBへ変換できるクラス、RGBからHSVへ変換できるクラス、
RGBからRGBにしか変換できないクラス。用途に応じて変換パターンを支配できる。
それから、RGBを作った数カ月後にHSVを定義しても、RGBからHSVに変換するような
処理を簡単に組み込めるよ。

interface RGB
{
        void change(double r,double g,double b);
}
interface HSV
{
        void change(double h,double s,double v);
}
interface RGBConvertor
{
        RGB to(RGB color);
}
interface HSVConvertor
{
        HSV to(HSV color);
}

0607デフォルトの名無しさん2011/07/05(火) 01:17:02.69
Point pが所属する空間Sによってある観点におけるの値vが変わるということは
vはpとSに依存し、それを与える写像が存在するということだろ
これはそのまま関数に対応する
0608デフォルトの名無しさん2011/07/05(火) 01:17:16.45
それは特にその方法の利点にはならないだろ
プロパティと値オブジェクトでも同じようなことはできるし、別にそれが汚いとは俺は思わない
むしろ抽象的すぎるクラスやインターフェイスが増殖するほうが気持ちが悪いと感じる
0609デフォルトの名無しさん2011/07/05(火) 01:20:30.98
キモイ抽象クラス増加させなくても一つの関数と値オブジェクトでいけるということだ
Genericsやtemplate, 依存型があると尚良し
0610デフォルトの名無しさん2011/07/05(火) 01:24:10.10
名前さえ合ってれば特定流れの手続きに突っ込めるってことか。
0611デフォルトの名無しさん2011/07/05(火) 01:31:52.25
関数を書き散らすが如く、インターフェースだけ最利用してクラスを
使い捨てにするような感覚が無いとキモイかもね。
オブジェクト = 関数の結果みたいな感じの設計デザインだし。

ただ、>>577みたいな感じで部品をぺきぺき組み合わせていくやり方は、
拡張が楽だし、きもちいいよ。

>>608 そう思うならそのやり方でいけばいいんじゃない?
個人的には構造体みたいな形で値が滞留するのが気持ち悪いと思うけど
逆のことを思う人は当然いるだろうし、そういう道でいいと思うよ。
0612デフォルトの名無しさん2011/07/05(火) 01:36:57.21
>>610
ん。そうなのかねぇ。
とりあえずこんなことができるのは面白そうだな。

void change(RGB source)
{
       RGB fillter1 = source;
       HSV fillter2;

       fillter1 = fillter1.To( new NegativePositive() );//ネガポジ
       fillter2 = fillter1.To( new Edge(0.9) );//強調
       fillter1 = fillter2.To( new Sepia() );//セピア
       fillter1.To( this.color ); //最終結果をメンバーへ
}
0613デフォルトの名無しさん2011/07/05(火) 01:47:05.02
>>608
>プロパティと値オブジェクトでも同じようなことはできるし
できるのか・・・。今までの流れだと無理臭い気が・・・。
0614デフォルトの名無しさん2011/07/05(火) 02:13:08.68
>>612
この方向なら「流れるようなインターフェース」の方が良いのでは?

流れるようなインターフェース
http://capsctrl.que.jp/kdmsnr/wiki/bliki/?FluentInterface
流れるようなインターフェースと脱CoC
http://d.hatena.ne.jp/higayasuo/20071018/1192681950
流れるようなインターフェースとメソッドチェーンは違うもの
http://d.hatena.ne.jp/higayasuo/20071025/1193319054
流れるようなインターフェース (使いやすさを高める)
http://d.hatena.ne.jp/bleis-tift/20090620/1245485402
進化するアーキテクチャーと新方式の設計: 流れるようなインターフェース
http://www.ibm.com/developerworks/jp/java/library/j-eaed14/
0615デフォルトの名無しさん2011/07/05(火) 02:22:29.25
>>614
中身見たが、流れるインターフェースっていうけどそれカリー化じゃね?
0616デフォルトの名無しさん2011/07/05(火) 02:26:22.28
>>614
変数省略してこう書いたのとは何が違うん?
void change(RGB source)
{
       source
              .To( new NegativePositive() )
              .To( new Edge(0.9) )
              .To( new Sepia() )
              .To( this.color );
}
0617デフォルトの名無しさん2011/07/05(火) 02:39:13.66
>>613
>>612のように書くと合成されたフィルタができてるように見えるけど違うぞ?
フィルタを順番に即時適用してるだけだ
色を引数に取って変換後の色を返す関数を順番に呼んでるのと一緒
フィルタの実装次第では遅延評価にもできるけど、それは関数でもそういう風にはできる
むしろ高階関数使うアプローチの方が自然
0618デフォルトの名無しさん2011/07/05(火) 03:19:46.39
>>617
value = lambda();
lambda()( value );
こうやってんのと同じってのは解るよ。
いや、プロパティと値オブジェクトって書いてあったから
もっとsetから入った値がgetで別の値に変わってるような
斬新な方法駆使してんのかと思ったから無理じゃねって書いたの。
0619デフォルトの名無しさん2011/07/05(火) 07:09:40.14
>>613
実現しようとしてるアプリケーションは作れるんじゃね?
大規模開発では
>抽象的すぎるクラスやインターフェイスが増殖するほうが気持ちが悪いと感じる
こういう人も紛れ込むし、頭いい方に合わせて底上げしようとしても
崩されたりモチベーション下げたりしてみんなが不幸になる。

割り切って構造化して「プロパティと値オブジェクト」にした方が
結果としてうまく行く場面も多いと思う。たとえ非OO的でソースが3倍にふくれあがってでも
代替要因が用意できて管理できることの方が重要なプロジェクトはある。
やりたくないけど仕事なのでそうも言ってられない
0620デフォルトの名無しさん2011/07/05(火) 07:11:59.74
色と色コンバーターがくっ付いている方が抽象化が進んでいるという発想は理解できない
0621デフォルトの名無しさん2011/07/05(火) 07:23:42.59
色コンバーターの結果が、色に抽象化されてるだけじゃん。
というか操作とデータが一緒であることが理解できないっていうとOO全否定じゃね。
まぁ、OOの観点から言えば、データは余計で全部結果を生む動作でやるのが
ただしいようだけど。smalltalkの標準ライブラリとか。
0622デフォルトの名無しさん2011/07/05(火) 07:26:29.00
>>619
 >>618
0623デフォルトの名無しさん2011/07/05(火) 07:33:41.18
>>617 インターフェースの引数を構造体みたいなもんで代用すればいいって言いたいんでしょ。
カプセル化の範囲絞り込みが出来ず原始回帰してるだけにしか見えん。
0624デフォルトの名無しさん2011/07/05(火) 07:53:29.87
>>606を見ると、自分で色と色コンバーターに分けてるんだね
しかし状態変更メソッドしか用意されてないRGBをどうすればコンバーターで操作できんだよ
結局引数を見ずに自分の情報でchangeを呼ぶしかないけど、それすら保証されていない謎インターフェイスになってるぞ
0625デフォルトの名無しさん2011/07/05(火) 08:13:32.38
それを言ったら下駄で内容無視してnull返しても同じじゃん。
あくまで要求仕様は存在するでしょ。
0626デフォルトの名無しさん2011/07/05(火) 08:34:37.87
そっちは別にどうでもいいんで、どうやって引数をコンバートするのか説明してください
0627デフォルトの名無しさん2011/07/05(火) 08:38:27.43
どうやって変換前の値を取得するんだろうな
0628デフォルトの名無しさん2011/07/05(火) 10:36:47.08
流れるようなインタフェースって、
Builderパターンとかによくハマる。
ビルダオブジェクトに対し、コネコネ、
グニグニ操作を加えていくのが楽しい。
0629デフォルトの名無しさん2011/07/05(火) 13:03:41.65
>>626
>>589

>>627
>>584

200レスも前の話じゃないだろ、
ゆとりは掲示板すら使えないのか。
0630デフォルトの名無しさん2011/07/05(火) 18:31:04.62
>>629
お前がコードか日本語を読めないのはわかった
0631デフォルトの名無しさん2011/07/05(火) 19:17:22.50
>>621
> というか操作とデータが一緒であることが理解できないっていうとOO全否定じゃね。
CLOS全否定だなwW
0632デフォルトの名無しさん2011/07/05(火) 19:55:03.87
ソフトウェア工学を追いかける奴とソフトウェア哲学を追いかける奴のせめぎ合いか... orz
OOPか... 森羅万象 オブジェクトとしての整理できる?
0633デフォルトの名無しさん2011/07/05(火) 20:00:01.21
そんな高尚な話じゃないぞ
自分で定義したインターフェイスで何ができるかも把握できてないのにドヤ顔してた馬鹿が叩かれてるだけだ
0634デフォルトの名無しさん2011/07/05(火) 20:44:37.41
>>631
CLOSこそデータと処理が一体化してるだろ。
処理自体がデータだし。
0635デフォルトの名無しさん2011/07/05(火) 20:48:15.25
俺は>>630がおかしいとしか思えないけと。
あんまりインターフェースの事解ってないように見えるし。
0636デフォルトの名無しさん2011/07/05(火) 21:05:49.22
正しく理解できてなかったら教えてほしんだが
>>606に従ってRGBをHSVに変換するとして、
class RGBToHSVConverter : RGB, HSVConverter { void RGB.change(略); HSV HSVConverter.to(HSV hsv); }
みたいにすればいいの? これどうやって実装すんの?
changeに渡された値をフィールドに保持したら結局値オブジェクトになってしまうから無意味だよね
コンストラクタかなんかでRGBConverterへの参照を渡してフィールドに持っておくとしても、
結局値オブジェクトを経由してRGB値を取ってくることになると思うんだけど
それとも、既存のRGB実装クラスにHSVへの変換をサポートさせたかったら
それぞれHSVConverterを実装しないといけないの?
で HSV to(HSV hsv) { hsv.change(Helper.rgbToHSV(this.argbval)); }みたいなのをコピペしてまわるわけ?
0637デフォルトの名無しさん2011/07/05(火) 21:06:42.08
>>635
レッテル貼りはいいから、>>606で

interface RGB{ void change(double r,double g,double b); }
interface RGBConvertor{ RGB to(RGB color); }

って定義されてるRGBConvertor(笑)が何をできるか考えてみろ

結局colorは呼び出し元に情報をもたらさないから、colorに依存しない値でchangeを呼び出すことしかできないだろ?
つまりRGBConvertorは手持ちのRGB情報を押し付けることしかできないインターフェイスだ
当然ネガポジだのセピアだのと言った変換も出来ない(出来るとしてもRGB側に実処理を書く必要がある)

このゴミ設計をどうしても使うとしたら、RGBConvertorをRGB値として使い、
RGB値を必要とするクラスでRGBを実装してロジック内で呼び出し、フィールドなりなんなりを書き換えて処理を行う必要がある
でもそれはスレッドアンセーフだから、結局別のRGBインスタンスにRGBのゲッターを公開してもらって使わないといけない
0638デフォルトの名無しさん2011/07/05(火) 21:39:07.36
class ConverterImpl implements RGB {
HSV dest;
void RGB.change(r, g, b) { dest.change(convertRGBToHSV(r, g, b)); }
}

HSV HSVConverter.to(HSV color) {
RGBConverter rgb = this.rgbSource;
rgb.to(new ConverterImpl { dest = color });
return color;
}
意地でも値のコピー作らないならこんな感じ?
汚っw
0639デフォルトの名無しさん2011/07/05(火) 21:57:06.23
>>638は論外として、なるほどな。
>>636と>>637はConvertorって名前に騙されてんだ。
まぁ、名前のつけ方が変ってのは確かかもな。

>>589を見ればtoで値をいじっちゃいけなくて、
change側で変更するって事が一目瞭然なのに。
0640デフォルトの名無しさん2011/07/05(火) 21:59:29.52
>>636 = >>637 = >>638 必死すぎだろ。
そんな否定することだけに必死になって盲目にならんでも。
0641デフォルトの名無しさん2011/07/05(火) 22:06:18.22
>>606をこう書き換えてやれば彼らは納得すんじゃない?

interface RGBConvertor
{
void analize(double r,double g,double b);
}
interface HSVConvertor
{
void analize(double h,double s,double v);
}
interface RGB
{
RGB to(RGBConvertor color);
}
interface HSVConvertor
{
HSV to(HSVConvertor color);
}
0642デフォルトの名無しさん2011/07/05(火) 22:12:46.88
あミスった
interface RGBConvertor
{
       void analize(double r,double g,double b);
}
interface HSVConvertor
{
       void analize(double h,double s,double v);
}
interface RGB
{
       RGBConvertor to(RGBConvertor color);
}
interface HSV
{
       HSVConvertor to(HSVConvertor color);
}
0643デフォルトの名無しさん2011/07/05(火) 22:16:14.38
>>641
その理解は>>588ですでに達してるんで
で、複数のRGBをもとにanalize(笑)するときはどうすんのって話
素直にゲッター付けろよ

あと(笑)ってのは「英語力が足りないんで中学からやり直してね」って意味だからね
Converterって書いた人もいたのに何も学ばないのね
0644デフォルトの名無しさん2011/07/05(火) 22:23:01.91
なんだずっと粘着してたのか。必死度メーターが振り切れてるぞ。
0645デフォルトの名無しさん2011/07/05(火) 22:24:32.35
>>643
>複数のRGBを元にanalize
 ?
0646デフォルトの名無しさん2011/07/05(火) 22:28:30.38
いくら、自分が誤解してたからって >>643 の言い訳は見苦しいわなぁ。
0647デフォルトの名無しさん2011/07/05(火) 22:31:30.72
setter/getterのためにだけにここまでアイデンティテが傷ついてる人って。
ぶっちゃけ引き下がるに下がれなくなったんだろうな。
0648デフォルトの名無しさん2011/07/05(火) 22:35:56.50
>>645
たとえばBitmap CreateLinearGradientImage(RGB, RGB, int, int)って処理を実装したい場合どうすんのかって話
引数別にクラスを分けるの?RGBが4つだったら?

って考えると素直にゲッター付けとけって話
0649デフォルトの名無しさん2011/07/05(火) 22:43:45.67
やっぱり下駄と雪駄に、こだわるのって一種好みなんだろうね。
どうにもプログラムを英語らしく書こうとしたりする人やら、
型判別がある言語でメソッド名に型名いれたがる人とかと同じ感覚なんじゃないかな?
そんな事したらオーバーライドしづらくなるんだけど、言語機能より人間の直感での
わかりやすさが大事らしい。
0650デフォルトの名無しさん2011/07/05(火) 22:44:52.24
もしかして: オーバーロード
0651デフォルトの名無しさん2011/07/05(火) 22:47:47.87
好み、というかある程度は先に分類があるかも。
構造体的に使うクラスってやっぱ無くならないと思うし。
例えばpairみたいなやつね。
getしたりsetしたり、ってのがほとんど目的になるから。
0652デフォルトの名無しさん2011/07/05(火) 22:49:59.55
>>648
RGB,RGBはなんとなく分かるけどint,intって何に使うの?
0653デフォルトの名無しさん2011/07/05(火) 22:51:09.66
>>652
サイズのつもり
0654デフォルトの名無しさん2011/07/05(火) 22:59:21.44
>>653
縦と横?
(ベクトルならまだしも、なんであんなところに登場すんのか意味が解からん・・・。)
0655デフォルトの名無しさん2011/07/05(火) 23:19:42.08
Bitmap CreateLinearGradientImage(RGB begin, RGB end, Vector vector)
{
        GradientArea gradient = new GradientArea( this.colorArray, vector );
        begin.to( new GradientBegin( gradient ) );
        end.to(new GradientEnd( gradient ) );
}

つかメソッド名がきたねぇよ。なんだよCreateLinearGradientImageって。
Gradient.Paint(・・・)でいいだろうが。
0656デフォルトの名無しさん2011/07/05(火) 23:29:59.68
>>654

こういう発想( >>638 )に至るアレな子だから・・・。
0657デフォルトの名無しさん2011/07/05(火) 23:33:46.44
>>655
それは>>648で予想してるとおりの実装だから書かなくてもいいよ
そのGradientBeginって中途半端なクラスを処理フローごとに分けるのが適切なのかって話をしてるわけ
その分だとRGBを使う画像ライブラリはよく分からん中間クラスで埋め尽くされるよ

>>656
それ別人
0658デフォルトの名無しさん2011/07/05(火) 23:38:30.88
関数だったら良くてクラスだったらダメなのか。
0659デフォルトの名無しさん2011/07/05(火) 23:45:24.32
void Paint(GradientBegin begin, GradientEnd end, Vector vector)
{
        GradientArea gradient = new GradientArea( this.colorArray, vector );
        begin.to( gradient );
        end.to( gradient );
}
てかこうやっとけばいいじゃん。
引数でグラデーションだと一目で分かるし。
メソッド名が汚くなくて済むし。
0660デフォルトの名無しさん2011/07/06(水) 00:14:28.40
>>658
俺はフローのステップ別にクラスを作るなんてコストは払いたくない、まあこれ以上は個人の嗜好だけど

>>659
colorArray持ってるのならコンストラクターを呼んだ時点でGradientAreaは完成させられると思うけど
それにcolorArray[i].to(this)を複数回呼ぶのが嫌だから>>655になったんだろ?
あと引数で全部渡したのはこれ以外の値を使うなって意図もあったんだけど、伝わらないもんだね
■ このスレッドは過去ログ倉庫に格納されています