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

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

6
次のコードスニペットからあまりにも多くのif / else-ifから脱出するより良い方法は何ですか?
入力として渡された「アクション」値に基づいてタスクを実行するサーブレットを作成しようとしています。 サンプルは次のとおりです public class SampleClass extends HttpServlet { public static void action1() throws Exception{ //Do some actions } public static void action2() throws Exception{ //Do some actions } //And goes on till action9 public void doPost(HttpServletRequest req, HttpServletResponse res)throws ServletException, IOException { String action = req.getParameter("action"); /** * I find …

3
なぜ「自己」が必要なのですか。インスタンス変数を参照するPythonで?
Java、Ruby、Haskell、Pythonなどの多くの言語でプログラミングを行ってきました。作業しているプロジェクトが異なるため、1日に多くの言語を切り替える必要があります。今、問題はself、Pythonの関数定義の最初のパラメーターが同じオブジェクトのメソッドを呼び出すことと同じであるため、書くのを忘れることが多いことです。 そうは言っても、このPythonのアプローチには非常に驚かされます。基本的には、JavaやRubyなどの言語では、現在のオブジェクトの変数を自動的に参照することで簡単にできるように、もっと入力する必要があります。 私の質問は、なぜこれがself必要なのですか?それは純粋にスタイルの選択ですか、それともPythonでselfJavaとC ++で省略できる方法を省略できないのthisですか?

3
継承よりも合成
私は自分自身にソフトウェア工学を教えようとしていますが、私を混乱させる矛盾する情報に出くわします。 私はOOPと抽象クラス/インターフェースとは何か、そしてそれらをどのように使用するかを学びましたが、「継承よりも合成を優先する」べきだと読んでいます。構成とは、あるクラスが別のクラスのオブジェクトを構成/作成して、その新しいオブジェクトの機能を利用/対話することです。 だから私の質問は...抽象クラスとインターフェイスを使用しないはずですか?抽象クラスを作成せず、その抽象クラスの機能を具象クラスで拡張/継承し、代わりに、新しいオブジェクトを作成して他のクラスの機能を使用するだけですか? または、構成を使用し、抽象クラスから継承することになっています。両方を一緒に使用しますか?もしそうなら、それがどのように機能し、その利点のいくつかの例を提供できますか? 私はPHPに最も慣れているので、他の言語に移り、新しく習得したSEスキルを移転する前に、それを使用してOOP / SEスキルを向上させています。

5
関数呼び出しはパフォーマンスにどの程度影響しますか?
メソッドや関数に機能を抽出することは、特にOOPにおいて、コードのモジュール性、可読性、相互運用性にとって不可欠です。 しかし、これはより多くの関数呼び出しが行われることを意味します。 コードをメソッドまたは関数に分割すると、現代の*言語のパフォーマンスに実際にどのような影響がありますか? *最も人気のあるもの:C、Java、C ++、C#、Python、JavaScript、Ruby ...

6
DDDがOOPを満たしている:オブジェクト指向リポジトリを実装する方法は?
DDDリポジトリの典型的な実装は、save()メソッドなど、あまりオブジェクト指向ではありません。 package com.example.domain; public class Product { /* public attributes for brevity */ public String name; public Double price; } public interface ProductRepo { void save(Product product); } インフラストラクチャ部分: package com.example.infrastructure; // imports... public class JdbcProductRepo implements ProductRepo { private JdbcTemplate = ... public void save(Product product) { JdbcTemplate.update("INSERT INTO …

1
フレンドクラスを使用してプライベートメンバー関数をC ++でカプセル化する-良い習慣ですか?
だから私は、次のようなことをすることでヘッダーにプライベート関数を置くことを避けることが可能であることに気付きました: // In file pred_list.h: class PredicateList { int somePrivateField; friend class PredicateList_HelperFunctions; public: bool match(); } // In file pred_list.cpp: class PredicateList_HelperFunctions { static bool fullMatch(PredicateList& p) { return p.somePrivateField == 5; // or whatever } } bool PredicateList::match() { return PredicateList_HelperFunctions::fullMatch(*this); } プライベート関数はヘッダーで宣言されることはなく、ヘッダーをインポートするクラスのコンシューマーは、それが存在することを知る必要はありません。これは、ヘルパー関数がテンプレートの場合に必要です(代替方法はヘッダーに完全なコードを配置することです)。これが、私がこれを「発見」した方法です。プライベートメンバ関数を追加/削除/変更する場合、ヘッダーを含むすべてのファイルを再コンパイルする必要がないというもう1つの利点があります。すべてのプライベート関数は.cppファイルにあります。 そう... これは有名なデザインパターンですか? 私にとって(Java / C#のバックグラウンドから来て、自分の時間でC …

4
無意味なデフォルト値を持つ構造体
私のシステムでは、私は頻繁に空港コード(で動作し"YYZ"、"LAX"、"SFO"、など)、彼らはまったく同じ形式(大文字として表現3文字)に常にあります。システムは通常、APIリクエストごとにこれらの(異なる)コードの25〜50を処理し、合計で1,000を超える割り当てが行われ、アプリケーションの多くのレイヤーを通過して、頻繁に同等性が比較されます。 最初は文字列を渡すだけで、少しはうまくいきましたが、3桁のコードが予期される場所に間違ったコードを渡すことで、多くのプログラミングの間違いにすぐに気付きました。また、大文字と小文字を区別しない比較を行うことになっていた問題に遭遇しましたが、代わりにそうしなかったため、バグが発生しました。 このことから、文字列の受け渡しを停止してAirport、空港コードを取得して検証する単一のコンストラクターを持つクラスを作成することにしました。 public sealed class Airport { public Airport(string code) { if (code == null) { throw new ArgumentNullException(nameof(code)); } if (code.Length != 3 || !char.IsLetter(code[0]) || !char.IsLetter(code[1]) || !char.IsLetter(code[2])) { throw new ArgumentException( "Must be a 3 letter airport code.", nameof(code)); } Code = code.ToUpperInvariant(); } public string …

3
ライブラリの可視性を処理する一般的な方法は何ですか?
クラスでprivateを使用するタイミングとprotectedを使用するタイミングに関するこの質問に、私は考えました。(この質問は関連しているため、最終クラスとメソッドにも拡張します。Javaでプログラミングしていますが、これはすべてのOOP言語に関連すると思います) 受け入れられた答えは次のとおりです。 良い経験則は、すべてをできるだけプライベートにすることです。 そしてもう一つ: すぐにサブクラス化する必要がない限り、すべてのクラスを最終クラスにします。 サブクラス化してすぐにオーバーライドする必要がない限り、すべてのメソッドをfinalにしてください。 メソッドの本体内で変更する必要がある場合を除き、すべてのメソッドパラメーターを最終的なものにします。 これは非常に単純明快ですが、アプリケーションではなく主にライブラリ(GitHubのオープンソース)を書いている場合はどうでしょうか。 多くのライブラリとシチュエーションに名前を付けることができます。 開発者が考えもしなかった方法でライブラリが拡張されました これは、可視性の制約のため、「クラスローダーマジック」およびその他のハックを使用して行う必要がありました。 ライブラリは構築されていない方法で使用され、必要な機能は「ハッキング」されました 可視性の低下により変更できない小さな問題(バグ、機能の欠落、「間違った」動作)のため、ライブラリを使用できませんでした 修正できなかった問題は、単純な関数(プライベートまたは最終)をオーバーライドするのに役立つ巨大でhugeいバグのある回避策につながりました。 そして、質問が長くなりすぎるまでこれらの名前を付け始め、それらを削除することにしました。 必要以上のコード、必要以上の可視性、必要以上の抽象化を持たないというアイデアが好きです。そして、これはエンドユーザー向けのアプリケーションを書くときに機能するかもしれません。その場合、コードはそれを書く人だけが使用します。しかし、コードが他の開発者によって使用されることを意図している場合、これはどのように持続しますか?元の開発者があらゆる可能なユースケースを事前に考え、変更/リファクタリングが困難/不可能である可能性は低いですか? 大きなオープンソースライブラリは新しいものではないので、オブジェクト指向言語を使用したこのようなプロジェクトで可視性を処理する最も一般的な方法は何ですか?


2
Smalltalkの「become:」の用途は何ですか?
become:Smalltalk のメッセージは、1つのオブジェクトを別のオブジェクトに変更し、そのオブジェクトへのすべての参照に影響を与えます。 この言語機能にはどのような用途がありますか?実際のコードで使用されますか?それは単なる好奇心ですか?それを使用するのは良い/悪い習慣と見なされますか?

7
パラメータリスト内のロガーの位置はどうあるべきか[閉じた]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 4年前に閉鎖されました。 私のコードでは、コンストラクターのパラメーターリストを介して、多くのクラスにロガーを挿入しています ランダムに配置していることに気付きました。リストの最初に表示される場合もあれば、最後に表示される場合もあります。 好みはありますか?私の直感では、一貫性はこの場合に役立ち、私の個人的な好みはそれを最初に置くことです。

6
ダウンキャストを避ける方法
私の質問は、スーパークラスの動物の特別なケースについてです。 私のAnimal缶moveForward()とeat()。 Seal拡張しAnimalます。 Dog拡張しAnimalます。 そしてまた延びている特別な生き物がありますAnimalと呼ばれるがHuman。 Humanメソッドもspeak()実装しAnimalます(では実装されません)。 受け入れる抽象メソッドの実装では、メソッドAnimalを使用したいと思いspeak()ます。それはダウンキャストをしなければ不可能だと思われます。ジェレミー・ミラーは彼の記事で、ひどい臭いがすることを書いた。 この状況でダウンキャストを回避するための解決策は何ですか?

1
Open Close Principle(OCP)vs依存関係反転原理(DIP)
Open Closed Principle(OCP)とDependency Inversion Princible(DIP)の違いを理解しようとしていました。 これまでにインターネットで行った調査に基づいて、「DIPはOCPを達成するための1つのオプション」という結論に達しました。 これでいいの? DIPではなくOCPに従っている例を教えてください。

4
モデルとビューを扱うときの切り替えとポリモーフィズム
私の問題に対するより良い解決策を見つけることができません。要素のリストを表示するView Controllerがあります。これらの要素は、B、C、Dなどのインスタンスになり、Aから継承できるモデルです。したがって、そのView Controllerでは、各項目はアプリケーションの異なる画面に移動し、ユーザーがそれらのいずれかを選択するとデータを渡す必要があります。私の頭に浮かぶ2つの選択肢は次のとおりです(構文を無視してください、それは特定の言語ではありません) 1)スイッチ(私はそれが悪いことを知っています) //inside the view controller void onClickItem(int index) { A a = items.get(index); switch(a.type) { case b: B b = (B)a; go to screen X; x.v1 = b.v1; // fill X with b data x.v2 = b.v2; case c: go to screen Y; etc... } } 2)多型 …

2
JavaがC ++のようなプライベート/保護された継承をサポートしないのはなぜですか?[閉まっている]
現在のところ、この質問はQ&A形式には適していません。回答は事実、参考文献、または専門知識によってサポートされると予想されますが、この質問は議論、議論、世論調査、または広範な議論を求める可能性があります。この質問を改善し、場合によっては再開できると思われる場合は、ヘルプセンターをご覧ください。 6年前に閉鎖されました。 C ++でクラスを継承している間、ユーザーは次のようなアクセス指定子を指定できます。 class Base { public int mem1; protected in mem2; }; class Derived1 : **private** Base { // mem1 will be private here. // mem2 will be private here. }; class Derived2 : **protected** Base { // mem1 will be protected here. // mem2 will be protected …

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