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

8
OOPは実際に手続き型プログラミングのどのような問題を解決しますか?
私は本「C ++ Demystified」を研究しました。今、私はRobert Laforeによる「Turbo C ++のオブジェクト指向プログラミング初版(第1版)」を読み始めました。これらの本を超えるプログラミングの知識はありません。この本は20年前のものなので、時代遅れかもしれません。私は最新版を持っています、私はそれが好きなので古いものを使用しています。主に、ラフォーの本の初版を通してC ++で使用されるOOPの基本概念を研究しています。 Laforeの本は、「OOP」が大きくて複雑なプログラムにのみ役立つことを強調しています。すべてのOOP本(同じくLaforeの本)で、手続き型のパラダイムはエラーを起こしやすいと言われています。たとえば、グローバルデータは関数によって簡単に脆弱です。プログラマーは、誤ってデータを破壊する関数を作成するなど、手続き型言語で正直なエラーを犯す可能性があると言われています。 正直に言って、この本に記載されている説明を把握していないため、質問を投稿しています。C++(4版)のオブジェクト指向プログラミングラフォーの本に書かれたこれらのステートメントを把握していません。 オブジェクト指向プログラミングは、プログラミングへの以前のアプローチで制限が発見されたために開発されました....プログラムがますます大きく複雑になるにつれて、構造化プログラミングアプローチでさえ緊張の兆候を示し始めます... ....これらの失敗は、手続き型パラダイム自体に弱点があることを明らかにしています。構造化プログラミングのアプローチがどれほどうまく実装されていても、大規模なプログラムは過度に複雑になります。...関連する2つの問題があります。まず、関数はグローバルデータに無制限にアクセスできます。第二に、手続き型パラダイムの基礎である無関係な関数とデータは、現実世界の貧弱なモデルを提供します... 私はジェフ・ケントによる「dysmystified C ++」という本を研究しました。この本がとても好きで、この本では主に手続き型プログラミングが説明されています。手続き型(構造化)プログラミングが弱い理由がわかりません! Laforeの本は、いくつかの良い例を使って概念を非常にうまく説明しています。また、OOPは手続き型プログラミングよりも優れているというLaforeの本を読んで、直感を理解しましたが、実際には手続き型プログラミングがOOPよりも弱いことを知りたいと思います。 手続き型プログラミングで直面する実際的な問題とは何か、OOPがプログラミングを容易にする方法を自分で確認したいと思います。私はLaforeの本を黙想的に読むだけで答えが得られると思いますが、手続き型コードの問題を自分の目で見たいです。プログラムのOOPスタイルのコードが、同じプログラムが手続き型パラダイムを使用して記述されていました。 OOPには多くの機能があり、これらのすべての機能が手続き型のコードを記述することによって発生する前述のエラーをどのように除去するかを説明することは不可能だと理解しています。 だから、ここに私の質問があります: OOPは手続き型プログラミングのどの制限に対処し、実際にこれらの制限を効果的に削除するのですか? 特に、手続き型パラダイムを使用して設計するのは難しいが、OOPを使用して簡単に設計するプログラムの例はありますか? PS:https : //stackoverflow.com/q/22510004/3429430からクロス投稿


3
タイプを推測することによる自動ダウンキャスト
Javaでは、変数をダウンキャストするために明示的にキャストする必要があります public class Fruit{} // parent class public class Apple extends Fruit{} // child class public static void main(String args[]) { // An implicit upcast Fruit parent = new Apple(); // An explicit downcast to Apple Apple child = (Apple)parent; } javaが型推論を行わないという事実を除いて、この要件には何らかの理由がありますか? 新しい言語で自動ダウンキャストを実装する際の「落とし穴」はありますか? 例えば: Apple child = parent; // no …

3
抽象データ型とオブジェクトの違いは何ですか?
Programmers.SEの答えは、クック(エッセイ特徴づけるオブジェクトはのADTではありませんが言うように) オブジェクトは、代数としてではなく、型の値に対する特性関数のように動作します。オブジェクトは型の抽象化ではなく手続き型の抽​​象化を使用します ADTは通常、プログラム内で固有の実装を持っています。言語にモジュールがある場合、ADTの複数の実装を持つことは可能ですが、それらは通常相互運用できません。 クックのエッセイでは、クックの論文で使用されているセットの特定の例では、オブジェクトは特徴的な関数と見なすことができるように思えます。オブジェクトは、一般的に特徴的な機能と見なすことはできないと思います。 また、Aldritchの論文相互運用性の力:なぜオブジェクトが避けられないのか ¹が示唆する クックの定義は、本質的に動的ディスパッチをオブジェクトの最も重要な特性として識別します これとアランケイが彼が言ったときに同意する 私にとってのOOPとは、メッセージング、ローカルでの保持と状態プロセスの保護と非表示、およびすべてのものの極端な遅延バインディングのみを意味します。 ただし、Aldritchの論文に対するこれらの関連する講義スライドでは、Java クラスはADTであり、Javaインターフェースはオブジェクトであることが示唆されています。実際、インターフェース「オブジェクト」を使用すると相互運用できます(上記の箇条書きのいずれかで示されるOOPの主要機能の1つ) )。 私の質問は 特徴的な関数はオブジェクトの主要な特徴ではなく、フランクシアラーは誤解していると私は言いますか? 動的ディスパッチを使用していなくても、Javaインターフェースを介して互いに通信するデータはオブジェクトの例ですか?どうして?(私の理解は、動的ディスパッチの方がより柔軟であり、そのインターフェースは、objective-C / smalltalk / erlangスタイルのメッセージングに向けたステップであることです。) 依存関係の逆転の原則の考え方は、ADTとオブジェクトの区別に関連していますか?(WikipediaのページまたはThe Talking Objects:A Tale About Message-Oriented Programmingを参照してください)私はこの概念に不慣れですが、プログラムの「レイヤー」間にインターフェースを追加することを含むことを理解しています(Wikipediaのページ図を参照)。 必要に応じて、オブジェクトとADTの違いの他の例/説明を提供してください。 ¹ (2013年発行)本論文では、読みやすいですし、Javaの例でクックの2009年の論文をまとめたものです。この質問に答えるのではなく、少なくともそれを流し読みすることを強くお勧めします。

5
OOPでのオブジェクトの状態の定義
オブジェクト指向プログラミング(論文用)における「オブジェクトの状態」の簡潔な定義が必要です。 約半日、このトピックについて引用できる論文を探しましたが、見つかりませんでした。私が見つけたすべての論文は、ほとんどがオブジェクト指向プログラミングに関する一般的な論文であり、オブジェクトの状態を定義していませんでした。 私にはわかりませんが、私の推測では次のようなもの があります。オブジェクトの状態は、オブジェクトのインスタンス変数の状態によって定義されます。 オブジェクトの状態の定義やトピックに関する参照を検索しています。 (ところで、この概念を「オブジェクトの状態」と呼んでもいいですか、それとも珍しいのですか?)

1
現代の正規表現の表現力
私は最近、主に単語のグループを特別なプロパティと照合する正規表現の課題を提案するWebサイトについて友人と話し合いました。彼は||||||||、数|が素数であるような文字列に一致する正規表現を探していました。そのような言語は、通常であれば、補題をポンプの翻訳が素数のためにあるという事実与えますので、私はすぐにそれが今まで動作しません彼に言われた十分な大きさ、それが存在するのk ≤ pがあるようP + N kは、すべての主要ですN ≥ - 1、よく、これは全くケースしにくい(素数の配分、そのような未知の自明とプロパティを破砕、...)pppk≤pk≤pk \leq pp+nkp+nkp + nkn≥−1n≥−1n \geq -1 しかし、誰かが解決策に付属している:一致しない(||+?)\1+ キャプチャグループに一致するように、この表現しようとする(つまりすることができ||、|||、||||などの上の出現箇所)のn ≥ 2回。一致する場合、文字列で表される数はkで割り切れるので、素数ではありません。それ以外の場合です。k≥2k≥2k \geq 2|n≥2n≥2n \geq 2kkk そして、グループ化と後方参照により、正規表現が理論的な意味で...正規表現よりも実際にはるかに表現力豊かになることが明らかになったので、私は愚かに感じました。今では、実際の正規表現を実行するときに私が知らなかったルックアラウンドやその他の演算子も追加されました。 ウィキペディアによると、文脈自由文法によって生成された言語よりもさらに表現力があります。だからここに私の質問があります: 現代の正規表現エンジンを使用して、(文脈自由文法から生成された)代数言語を表現できますか より一般的な説明、または現代の正規表現で説明できる言語の種類の複雑さの少なくとも上限はありますか? より実用的には、その背後に深刻な理論がありますか、それとも有限オートマトンに基づく実際の正規表現の最初のブロックに実装可能と思われるたびに新しい機能を追加するだけですか? 「モダンな正規表現」は質問が具体的ではないことを知っていますが、少なくとも後方参照を使用することを意味します。もちろん、この「現代の正規表現」言語に対する特定の制限を想定している部分的な回答者がいる場合は、遠慮なく投稿してください。

1
多重継承オブジェクト指向言語でのメソッド解決のためのC3線形化アルゴリズム:実装の詳細の正当化の探求
この Pythonのメソッド解決順序(mro)、別名C3線形化の説明によれば、アルゴリズムは次のように再帰的に説明できます。 L(O) = <O> L(C) = <C> + merge(L(B1),..., L(Bn), <B1,...,Bn>) どこ O すべてのクラスが継承するクラスです。 Cは、、B1...、から直接Bnこの順序で継承するクラスです。 <および>リスト区切り文字です。 + リスト連結演算子です。 merge 以下で説明する方法で、そのリスト引数を単一のリストにマージします。 上記は単語で言い換えることができます(上記のPythonドキュメントから引用): Cの線形化は、Cと、親の線形化と親のリストのマージの合計です。 merge(本質的にPythonのドキュメントから引用したが、わずかに言い換え)以下のようなアルゴリズムが記載されています。 最初のリストの先頭、つまりL(B1)[0]を検討します。それが良い先頭である場合、つまり他のリストの適切な末尾にない場合は、Cの線形化に追加して削除しますマージのすべてのリストから。そうでない場合は、次のリストの頭などを検討します。クラスがなくなるか、頭がなくなるまで繰り返します。後者の場合、マージを構築することは不可能です。 次の例は、説明のためのものです。仮定Aから直接継承するBとC、このために、との線形化したとするBとCしています L(B) = <B, D, E, O> L(C) = <C, D, F, O> 次に、A線形化は L(A) = <A> + merge(<B,D,E,O>, <C,D,F,O>, <B,C>) = <A, B> + …

3
継承、およびJavaのような言語でのメンバー/属性およびメソッドへの動的アクセス
JavaのようなOOプログラミング言語での継承について質問があります。メソッドとその呼び出しをコンパイルする方法を説明したとき、それは私のコンパイラクラスで思い付きました。コンパイルするソース言語の例としてJavaを使用していました。 次に、このJavaプログラムについて考えてみましょう。 class A { public int x = 0; void f () { System.out.println ( "A:f" ); } } class B extends A { public int x = 1; void f () { System.out.println ( "B:f" ); } } public class Main { public static void main ( String …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.