タグ付けされた質問 「object-oriented」

システムを、モジュール方式で制御および操作できるオブジェクトのセットとしてモデル化できるようにする方法論

5
Goのような言語に対する従来のOOPの利点
私は言語設計と「理想的な」プログラミング言語に必要な要素について多くのことを考えてきましたが、GoogleのGoを勉強することで、そうでなければ一般的な知識の多くを疑問視するようになりました。 具体的には、Goはオブジェクト指向言語の構造を実際に持たずに、オブジェクト指向プログラミングの興味深い利点をすべて備えているようです。クラスはなく、構造のみがあります。クラス/構造の継承はなく、構造の埋め込みのみです。階層はなく、親クラスも、明示的なインターフェイス実装もありません。代わりに、型キャストルールはアヒルのタイピングに似た緩やかなシステムに基づいており、構造体が「リーダー」または「リクエスト」または「エンコード」の必要な要素を実装する場合、キャストして使用できます。一つとして。 Goのような言語に移行するときにあきらめなければならない、本質的に機能性、保守性、強力な、C ++およびJavaとC#で実装されたOOPについて何かありますか?この新しいパラダイムが表すシンプルさを得るために、あきらめなければならないメリットは何ですか? 編集 読者が過度にハングアップして怒りを覚えるように見える「時代遅れの」質問を削除しました。 問題は、一般的な言語の実装でよく見られる従来のオブジェクト指向のパラダイム(階層など)は、この単純なモデルでは簡単に実行できないものを提供する必要があるということです。または、言い換えると、今日言語を設計する場合、クラス階層の概念を含めたい理由はありますか?

5
単体テストの手続きコードは効果的ですか?
現在のプロジェクトでは、コードに浸透していると思われる一定量のバグを回避するために、開発サイクルにユニットテストを組み込むことを望んでいます。問題は、スパゲッティコードの95%が手続き型であり、ユニットテストを一度も行ったことがないことです(ユニットテストの経験はすべて、OOPコードを使用したことです) 簡単に言えば、私の質問は、現在のコードベースで単体テストを進めるのが賢明でしょうか、それともアプリケーションが適切なOOPフレームワークに移行されるまで延期することを提案するのでしょうか? PS:私はこの問題を言語にとらわれないものとしてスタイル付けようとしましたが、問題のアプリケーションはPHPとjavascriptを使用していると述べると、経験からこの発生はこのようなアプリケーションで最も多く発生するため、この質問に答えることができるより具体的な回答を提供するのに役立つと感じています。

7
シングルトン、抽象クラス、インターフェースの役割は何ですか?
私はC ++でOOPを勉強しており、これら3つの概念の定義を知っていても、それをいつどのように使用するかを本当に理解できません。 このクラスを例に使用してみましょう。 class Person{ private: string name; int age; public: Person(string p1, int p2){this->name=p1; this->age=p2;} ~Person(){} void set_name (string parameter){this->name=parameter;} void set_age (int parameter){this->age=parameter;} string get_name (){return this->name;} int get_age (){return this->age;} }; 1. シングルトン クラスが1つのオブジェクトのみを機能させるという制限はどのように機能しますか? CANあなたは持っているだろう、クラス設計ONLY 2のインスタンスを?それとも3? WHEN /必要な推奨シングルトンを使用していますか?それは良い習慣ですか? 2. 抽象クラス 私の知る限り、純粋な仮想関数が1つしかない場合、クラスは抽象になります。だから、追加 virtual void print ()=0; しますよね? なぜあなたは、そのオブジェクト必要とされていないクラスが必要でしょうか? …

2
アクターモデルの説明は正しいですか?
私が理解した場合、アクターモデルはオブジェクトモデルに似ていますが、いくつかの違いがあります。 すべてのオブジェクトはそれ自身の独立したスレッドを生成し、数千のオブジェクトがある場合でも問題はありません。 アクターは、関数を呼び出して戻り値を取得することによって対話するのではなく、メッセージを送受信することによって対話します。 そのモデルに違反しない場合、アプリは競合状態のリスクなしに、最大限の同時実行を使用します。 オブジェクト指向でできることはすべて、アクターを使用して行うことができますが、問題は、ここ数年でコーディングしたすべてがオブジェクト指向に基づいていたということです-しかし、移行は差し迫っています。 したがって、たとえば、3Dベクトルクラス/アクターを定義し、2つのインスタンスを作成し、それらの和演算を呼び出す必要があるとします。 オブジェクト指向: class V3d { constructor V3d(x,y,z) //bla float x,y,z; function sum(V3d b) { return V3d(x+b.x,y+b.y,z+b.z); } } //using: mySum = V3d(1,2,3).sum(V3d(3,2,1)) //creates 2 instances, sum, returns instantly drawPoint(mySum) //uses the result 俳優モデル: actor V3d { constructor V3d(x,y,z) //bla float x,y,z; loop { receive 'sum',b:V3d …

3
SOLID原則の適用
私は、SOLIDの設計原則にまったく慣れていません。私はそれらの原因と利点を理解していますが、SOLID原則を使用するための実践的な演習としてリファクタリングしたい小規模なプロジェクトにそれらを適用できません。完全に機能するアプリケーションを変更する必要はありませんが、とにかくそれをリファクタリングして、将来のプロジェクトの設計経験を積みたいと思います。 アプリケーションには次のタスクがあります(実際にはそれ以上のことですが、簡単にしましょう):データベーステーブル/列/ビューなどの定義を含むXMLファイルを読み取り、作成するために使用できるSQLファイルを作成する必要がありますORACLEデータベーススキーマ。 (注:なぜそれが必要なのか、なぜXSLTを使用しないのかなどについて議論することは控えてください。理由はありますが、トピックから外れています。) はじめに、テーブルと制約のみを見ることにしました。列を無視する場合、次のように記述できます。 制約はテーブルの一部(より正確にはCREATE TABLEステートメントの一部)であり、制約は別のテーブルを参照する場合もあります。 最初に、アプリケーションがどのように見えるかを説明します(SOLIDを適用しない): 現時点では、アプリケーションには、テーブルが所有する制約へのポインターのリストと、このテーブルを参照する制約へのポインターのリストを含む「テーブル」クラスがあります。接続が確立されるたびに、逆方向の接続も確立されます。このテーブルには、各制約のcreateStatement()関数を順に呼び出すcreateStatement()メソッドがあります。このメソッド自体は、名前を取得するために所有者テーブルと参照先テーブルへの接続を使用します。 明らかに、これはSOLIDにはまったく適用されません。たとえば、循環的な依存関係があり、必要な「追加」/「削除」メソッドといくつかの大きなオブジェクトデストラクタに関してコードが肥大化しました。 そのため、いくつか質問があります。 依存性注入を使用して循環依存関係を解決する必要がありますか?もしそうなら、Constraintはそのコンストラクタで所有者(およびオプションで参照される)テーブルを受け取るべきだと思います。しかし、単一のテーブルの制約のリストをどのように実行できますか? Tableクラスが自身の状態(テーブル名、テーブルコメントなど)とConstraintsへのリンクの両方を保存する場合、これらの1つまたは2つの「責任」は、単一責任の原則と考えられますか? ケース2.が正しい場合、リンクを管理する論理ビジネスレイヤーに新しいクラスを作成するだけですか?その場合、1は明らかに関連しなくなります。 「createStatement」メソッドは、Table / Constraintクラスの一部である必要がありますか、それともそれらを移動する必要がありますか?もしそうなら、どこへ?各データストレージクラス(つまり、テーブル、制約など)ごとに1つのマネージャークラスですか?または、リンクごとにマネージャークラスを作成します(3と同様)。 これらの質問に答えようとするたびに、どこかで輪になって走っています。 列やインデックスなどを含めると、問題は明らかにはるかに複雑になりますが、単純なテーブル/制約のことで手伝ってくれれば、残りは自分で解決できるかもしれません。

5
オブジェクト指向プログラムは有限状態マシンとして見ることができますか?
これは哲学的/基本的な質問かもしれませんが、ただ明確にしたいだけです。 私の理解では、有限状態マシンは、システムの出力が現在の入力だけでなく、システムの現在の状態にも依存するシステムをモデル化する方法です。さらに、名前が示唆するように、有限状態マシンは、それぞれの状態と動作を持つ有限のN個の状態にセグメント化できます。 これが正しい場合、データおよび関数メンバーを持つすべてのオブジェクトをオブジェクト指向モデルの状態にして、オブジェクト指向設計を有限状態マシンにするべきではありませんか? それがオブジェクト設計におけるFSMの解釈ではない場合、ソフトウェアでFSMを実装するとき、人々は正確に何を意味しますか?私は何かが欠けていますか? ありがとう

7
不変性を回避する
私はオブジェクト指向プログラミングに慣れていないので、把握に時間がかかっている概念の1つは不変性です。昨夜電球が消えたと思うが、確認したい: 不変オブジェクトを変更できないというステートメントに出くわすと、たとえば次のようなことができるため困惑します。 NSString *myName = @"Bob"; myName = @"Mike"; そこで、不変型NSStringのmyNameを変更しました。私の問題は、「オブジェクト」という言葉がメモリ内の物理オブジェクト、または抽象化「myName」を指すことがあるということです。前者の定義は、不変性の概念に適用されます。 変数については、不変性のより明確な(私にとって)定義は、不変オブジェクトの値は、メモリ内の位置、つまり参照(ポインタとも呼ばれる)を変更することによってのみ変更できるということです。 これは正しいですか、それとも私はまだ森の中で迷っていますか?

7
圧倒的なコードを管理可能なチャンクに分解する最良の方法は?
特定のレベルの複雑さに達すると、大規模なプロジェクトに絶えず圧倒されます。プロジェクトの特定のポイントに達すると、進行が遅くなり、絶えずステップをたどり、あらゆる種類の混乱を整理します。 私のこの弱さのために、リファクタリングが本当に上手になりました。そして、私は常にオブジェクトをより小さく管理しやすいものに分解しようとしています。この弱点のために、物事を適切に設計することにあまりにも注意を払うことになりました。 問題を小さな問題に分解できれば、スムーズに達成できると思います。頭に浮かぶ戦略の1つは、テスト駆動開発です。他に何ができますか?

8
PHPはオブジェクト指向ですか?[閉まっている]
現在のところ、この質問はQ&A形式には適していません。回答は事実、参考文献、または専門知識によってサポートされると予想されますが、この質問は議論、議論、世論調査、または広範な議論を求める可能性があります。この質問を改善し、場合によっては再開できると思われる場合は、ヘルプセンターをご覧ください。 7年前に閉鎖されました。 私は同僚と興味深い会話をする機会がありました。それらのほとんどは、フラッシュアクションスクリプトまたはJava開発者です。 phpがOOPをうまく処理することについて話しました。PHPは、PHP 5.2または5.3のほとんどすべてのOOPを処理できると述べました。私が間違っている?はい/いいえで答えようとはしていませんが、開発者からもっと意見を聞きたいです。

4
FPとOOは直交ですか?
私は何度も何度も耳にしましたが、FPとOOは直交しているという考えを理解し、検証しようとしています。 まず、2つの概念が直交しているとはどういう意味ですか? FPは、可能な限り不変性と純度を推奨します。そしてオブジェクト指向は、状態と突然変異(命令型プログラミングのわずかに組織化されたバージョン?)のために構築されたもののようです。そして、私はオブジェクトが不変であることを理解しています。しかし、オブジェクト指向は私に状態/変化を暗示しているようです。 彼らは反対のように見えます。それは、それらが直交しているということですか? Scalaのような言語を使用すると、OOとFPの両方を簡単に実行できますが、これは2つのメソッドの直交性に影響しますか?

6
円と楕円の問題は、関係を逆にすることで解決できますか?
持つCircle拡張Ellipse休憩にリスコフSubstition原理、すなわち、あなたはXとYが独立して楕円を描くように設定することができますが、Xは、常に円のためにYに等しくなければなりません:それは事後条件を変更するため、。 しかし、ここでの問題は、Circleを楕円のサブタイプにすることによって引き起こされたのではないでしょうか?関係を逆転させることはできませんか? ですから、Circleはスーパータイプです-メソッドは1つだけですsetRadius。 次に、setXとを追加して、楕円が円を拡張しsetYます。setRadiusEllipseを呼び出すと、XとYの両方が設定されます。つまり、setRadiusの事後条件は維持されますが、拡張インターフェースを使用してXとYを個別に設定できるようになりました。

1
静的メソッドを悪用していますか?
数ヶ月前、私は新しいプロジェクトで働き始めました。コードを調べてみると、使用されている静的メソッドの量が多くなりました。としてのユーティリティメソッドだけcollectionToCsvString(Collection<E> elements)でなく、多くのビジネスロジックも保持されます。 私はこの背後にある理論的根拠の責任者に尋ねたとき、彼はそれが春の専制政治から逃げる方法だと言った。この思考プロセスに何かがあります:顧客の領収書作成方法を実装するために、サービスがあります @Service public class CustomerReceiptCreationService { public CustomerReceipt createReceipt(Object... args) { CustomerReceipt receipt = new CustomerReceipt(); // creation logic return receipt; } } さて、この男は、基本的にはクライアントクラスがSpring Beanでなければならないという制限を課しているため、Springによって不必要に管理されるクラスを持つことを嫌うと言いました。最終的にすべてをSpringで管理することになります。これにより、手順を踏まずにステートレスオブジェクトを操作する必要が生じます。ここに記載されている内容は多かれ少なかれhttps://www.javacodegeeks.com/2011/02/domain-driven-design-spring-aspectj.html したがって、上記のコードの代わりに、彼は public class CustomerReceiptCreator { public static CustomerReceipt createReceipt(Object... args) { CustomerReceipt receipt = new CustomerReceipt(); // creation logic return receipt; } } …

2
OptionalsとNullableタイプの違いは何ですか
スイフトが持っていOptionalsます。C#にはNullable型があります。 両方が同じ目的を果たすことを伝えることができる限り、あるタイプの値に加えて、変数が値を持っているか未定義(初期化されていない)かを情報を保存します。 質問は、名前が異なるOptionalsだけのNullableタイプですか、または他の概念的な違いがありますか? 別の言い方をすると、概念自体について、または持っていない、Optionalsまたは持っていない言語の文脈で話すことはNullables、用語が使われていることを意味しますか? 言語でその機能を実装するとき、タイプに名前を付けるOptionals<T>か、Nullable<T>


2
OOPの「オブジェクト」と「クラス」は、アセンブリ言語の観点からメモリ内でどのように編成されていますか?
オブジェクトはメモリ内でどのように編成されますか? たとえば、関数はメモリ内のコードの一部であり、スタックやレジスタを介してパラメータを期待し、独自のスタックフレームを処理することを知っています。 しかし、オブジェクトははるかに複雑な構造です。彼らはどのように編成されていますか?各オブジェクトにはメソッドへの「リンク」があり、アドレスを自分自身にそのメソッドに渡しますか? このトピックの良い説明を見るのは素晴らしいことです。 UPD。私は質問をより正確にし、主に静的型付け言語に興味があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.