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

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

6
オブジェクトをプレゼンターにマッピングするクリーンなOOP方法
私は、それぞれの作品は、独自のタイプ(のようであるジャワ、中(例えばチェスなど)ボードゲームを作成していますPawn、Rookなど)。アプリケーションのGUI部分では、これらの各部分の画像が必要です。やることは rook.image(); UIとビジネスロジックの分離に違反しているため、作品ごとに異なるプレゼンターを作成し、作品タイプを対応するプレゼンターにマッピングします。 private HashMap<Class<Piece>, PiecePresenter> presenters = ... public Image getImage(Piece piece) { return presenters.get(piece.getClass()).image(); } ここまでは順調ですね。ただし、getClass()メソッドを呼び出すと慎重なOOPの第一人者が眉をひそめ、次のようなビジターを使用することをお勧めします。 class Rook extends Piece { @Override public <T> T accept(PieceVisitor<T> visitor) { return visitor.visitRook(this); } } class ImageVisitor implements PieceVisitor<Image> { @Override public Image visitRook(Rook rook) { return rookImage; } } 私はこのソリューションを気に入っています(ありがとう、第一人者)が、1つの重大な欠点があります。新しいピースタイプがアプリケーションに追加されるたびに、PieceVisitorを新しいメソッドで更新する必要があります。私のシステムをボードゲームフレームワークとして使用して、フレームワークのユーザーがピースとそのプレゼンターの両方の実装のみを提供し、それをフレームワークにプラグインするだけの簡単なプロセスで新しいピースを追加できるようにします。私の質問:このような拡張性を可能にするinstanceof、getClass()などのないクリーンなOOPソリューションはありますか?

4
単一の責任を持つ大規模なクラス
2500行のCharacterクラスがあります。 ゲーム内のキャラクターの内部状態を追跡します。 その状態をロードして永続化します。 〜30個の着信コマンドを処理します(通常=に転送しますGameが、一部の読み取り専用コマンドはすぐに応答します)。 Game実行中のアクションと他のユーザーの関連アクションに関する〜80の呼び出しを受け取ります。 私にCharacterは、単一の責任があるように思われます。キャラクターの状態を管理し、受信コマンドとゲームを仲介することです。 既に分割されている他のいくつかの責任があります。 CharacterOutgoingクライアントアプリケーションの発信更新を生成するために呼び出すがあります。 Characterは、Timer次に何ができるかを追跡するを持っています。着信コマンドはこれに対して検証されます。 だから私の質問は、SRPや同様の原則の下でこのような大規模なクラスを持つことは容認できますか?煩雑さを軽減するためのベストプラクティスはありますか(メソッドを個別のファイルに分割するなど)。それとも、私は何かを見逃していますか?それを分割する本当に良い方法はありますか?これは非常に主観的なものであり、他の人からのフィードバックが欲しいと思います。 サンプルを次に示します。 class Character(object): def __init__(self): self.game = None self.health = 1000 self.successful_attacks = 0 self.points = 0 self.timer = Timer() self.outgoing = Outgoing(self) def load(self, db, id): self.health, self.successful_attacks, self.points = db.load_character_data(id) def save(self, db, id): db.save_character_data(self, health, self.successful_attacks, self.points) …

3
インターフェイスを含むシミュレーションのこのOOP設計は悪いですか?
私は吸血鬼、オオカミ、人間、トラックをシミュレートするために自分の小さなOOPプログラムを設計しており、インターフェイスに関する私自身の限られた理解を実装しようとしています。 (私はまだここで抽象化しており、まだコードの実装がないので、OOP設計の問題です...私は思う!) これらのクラス間の「共通の振る舞い」を探して、インターフェースとして実装するのは正しいですか? たとえば、ヴァンパイアとオオカミの噛みつき...噛み付きのインターフェースが必要ですか? public class Vampire : Villain, IBite, IMove, IAttack トラックについても同様です... public class Truck : Vehicle, IMove そして人間のために... public class Man : Human, IMove, IDead 私の考えはここにありますか?(あなたの助けに感謝)

4
C構造体は、関数を持っているように動作できますか?
struct構造体がメンバーを持つことはできますが、関数を持つことはできないCとs を使用します。簡単にするために、名前を付けた文字列の構造体を作成し、文字列のインデックスと位置の文字を置き換える文字をどこでstrできるようにするかを想定します。構造体は関数を持たないか、この動作を実装し、構造体が実際に構造体だけが新しい構造体にコピーして更新する(単純な)関数を持つことができることを模倣する方法がまだあるので、これは決して不可能でしょうか?それができるフィールド?str.replace(int i, char c)ici したがってreplace、アクセスされたときなどに更新される新しい構造体を指す構造体の3番目のメンバーである可能性があります。できますか?それとも、私の意図を妨げる組み込みのものや、何らかの理論やパラダイムがありますか? 背景は、私がCコードを書いていることであり、OOP言語のライブラリビルトインであることがわかっている関数を再発明し、OOPは文字列とコマンドを操作する良い方法だと思います。

3
Swiftの各デリゲートに個別のクラス拡張を使用する理由は何ですか?
私はレイ・ウェンダリッヒのチュートリアルを進めていましたが、作者がクラス拡張機能を使用してデリゲートコールバックを保持していることに気付きました。 クラス拡張内のコールバックを委任する: extension LogsViewController : UIPopoverPresentationControllerDelegate { func adaptivePresentationStyleForPresentationController(controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle { ... } } それをクラス内に含めるのではなく: クラス内のコールバックを委任する: class LogsViewController : UITableViewController, UIPopoverPresentationControllerDelegate { func adaptivePresentationStyleForPresentationController(controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle { ... } } 私はこれを同時に奇妙で面白いと感じました。「LogsViewControllerExtension.swift」という名前のLogsViewControllerクラスの拡張機能専用のファイルがあり、デリゲートプロトコルごとに異なる拡張機能があります:UITableViewDataSource、UISplitViewDelegateなど。 それぞれ独自のファイル内でコールバックを委任する複数のクラス拡張機能: extension LogsViewController: UISplitViewControllerDelegate { ... callbacks } extension LogsViewController : UIPopoverPresentationControllerDelegate …

3
コンストラクターを構造体に追加する必要がありますか?
メンバメソッドを備えた完全なモジュールにできるクラスではなく、c ++構造体を使用してデータ構造を定義することがよくあります。今、私たちはそれらが両方とも同じであることがわかります(大まかに言って)。 構造体をデータのみのエンティティとして頻繁に使用/処理するという事実は、デフォルトのコンストラクタも追加しないという衝動を引き起こします。しかし、コンストラクターは常に優れており、物事を単純化し、エラーを排除するのに役立ちます。 デフォルトのコンストラクタをデータ構造に追加すると、眉をひそめますか? 他の基準が満たされている場合、デフォルトコンストラクターを実装すると、構造体は非POD(プレーンな古いデータ型)になりますか? 物事を視野に入れるために、簡単な例を考えてみましょうが、実際には構造体ははるかに大きくなります。 struct method { char name[32]; float temperature; int duration; }; メソッドを作成するたびに、値を設定するのを忘れた場合、(控えめに言っても)心配する必要があります。temperatureメソッドを設定してシステムに適用するのを忘れてしまったことを想像してください。このメソッドはランダムに高い値になり、混乱を引き起こします。または、設定するのを忘れたためduration、メソッドが未知の高期間にわたって適用されます。 オブジェクトを保証するコンストラクタを実装するのではなく、毎回オブジェクトを初期化する責任を負うべきなのはなぜですか?

6
依存性注入フレームワークの引数の1つに疑問を投げかける:なぜオブジェクトグラフを作成するのが難しいのですか?
Google Guiceのような依存性注入フレームワークは、その使用(ソース)に次の動機を与えます。 オブジェクトを構築するには、まずその依存関係を構築します。しかし、各依存関係を構築するには、その依存関係などが必要です。したがって、オブジェクトを作成するときは、オブジェクトグラフを作成する必要があります。 手作業でオブジェクトグラフを作成するのは手間がかかり(...)、テストが困難になります。 しかし、私はこの議論を買いません。依存性注入フレームワークがなくても、インスタンス化が簡単で、テストが便利なクラスを作成できます。たとえば、Guiceの動機付けページの例を次のように書き換えることができます。 class BillingService { private final CreditCardProcessor processor; private final TransactionLog transactionLog; // constructor for tests, taking all collaborators as parameters BillingService(CreditCardProcessor processor, TransactionLog transactionLog) { this.processor = processor; this.transactionLog = transactionLog; } // constructor for production, calling the (productive) constructors of the collaborators public BillingService() …

6
オブジェクト指向プログラミングの練習方法は?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 6年前に閉鎖されました。 ロックされています。この質問とその回答はロックされています。なぜなら、質問はトピックから外れていますが、歴史的に重要だからです。現在、新しい回答やインタラクションを受け付けていません。 私は常に手続き型言語でプログラミングしてきましたが、現在はオブジェクト指向に向かっています。私が直面した主な問題は、効果的な方法でオブジェクトの向きを練習する方法が見つからないことです。私のポイントを説明します。PHPとCを学んだときは、練習するのはとても簡単でした。何かを選択し、そのアルゴリズムを考えるだけでした。 たとえば、PHPでは、座って考えてみるのが問題でした。「実は、製品を追加できる管理領域を備えたアプリケーションを1つ作成してみましょう」。これは非常に簡単でした。ユーザーを登録し、ユーザーをログインし、製品を追加するアルゴリズムを考える必要がありました。これらをPHPの機能と組み合わせて、練習するのに良い方法でした。 さて、オブジェクト指向では、さらに多くのものがあります。アルゴリズムについて考えるだけでなく、要件をより深く分析し、ユースケースを記述し、クラス図、プロパティとメソッドを理解し、依存関係の注入などを設定します。 主なポイントは、私がオブジェクト指向を学習している方法では、良いデザインが重要であるように思えるのに対し、手続き型言語では曖昧なアイデアで十分だったということです。手続き型言語では、設計なしで良いソフトウェアを書くことができると言っているのではなく、それを実践するために実行可能であるだけであり、オブジェクト指向では、実行するためでさえ、適切な設計なしでは行けないようです。 これは問題のようです。練習するたびに多くの要件やユースケースなどを把握する必要がある場合、オブジェクトの向きを改善するのに良い方法ではないようです。練習するたびにアプリのアイデアを1つ持つようにしています。 そのため、オブジェクトの向きを練習する良い方法は何ですか?

6
どの機能機能がもたらすメリットについて、OOPを少し混乱させる価値がありますか?
HaskellとF#で関数型プログラミングを学んだ後、OOPパラダイムはクラス、インターフェース、オブジェクトで後戻りしているように見えます。同僚が理解できるFPのどの側面を仕事に持ち込めますか?使用できるようにチームを再訓練することについて、上司と話す価値のあるFPスタイルはありますか? FPの可能な側面: 不変性 部分適用とカレー ファーストクラス関数(関数ポインター/機能オブジェクト/戦略パターン) 遅延評価(およびモナド) 純粋な機能(副作用なし) 式(対ステートメント-コードの各行は、副作用の代わりに、または副作用を引き起こすことに加えて、値を生成します) 再帰 パターンマッチング それは、プログラミング言語がサポートしている限り、その言語がサポートする制限まで何でもできる、すべての人にとって自由なものですか?または、より良いガイドラインがありますか?

4
Rails:デメテルの混乱の法則
私はRails AntiPatternsという本を読んでいて、彼らはデメテルの法則を破らないために委任を使うことについて話しています。主な例は次のとおりです。 彼らは、コントローラでこのようなものを呼び出すことは悪いと信じています(そして私は同意します) @street = @invoice.customer.address.street 提案された解決策は、次のことを行うことです。 class Customer has_one :address belongs_to :invoice def street address.street end end class Invoice has_one :customer def customer_street customer.street end end @street = @invoice.customer_street ドットを1つしか使用しないため、ここでデメテルの法則に違反していないと述べています。あなたはまだ顧客を通り抜けて住所を通り、請求書の番地を取得しているので、これは間違っていると思います。私は主に私が読んだブログ投稿からこのアイデアを得ました: http://www.dan-manges.com/blog/37 ブログの投稿では、主な例は class Wallet attr_accessor :cash end class Customer has_one :wallet # attribute delegation def cash @wallet.cash end end …

1
なぜ関数型プログラミングより命令型プログラミングが好ましいのですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 6年前に閉鎖されました。 背景:私は、一般的なメンタルモデルが不可欠なプログラミングであるVB.NETショップで働く関数型プログラミングを提唱しています。システムの基盤はWinFormsであるため、命令型プログラミングから完全に逃れることはできないと理解できますが、そのメリットを信じているため、可能な限りFP(主にLinq経由)を使用しようとしています。 FPに対する議論と反論 流fluentなLinqは、このスタイルがシーケンスを別のシーケンスまで処理し、それを繰り返すという点で、命令型の対応するものよりも効率が低いことに気付くかもしれません。一般に、シーケンス上の繰り返しパスを避けるために最適化できる命令型アプローチよりも数パス多くかかります。このため、リードは、明らかに「効率が悪い」機能的アプローチを選択する理由を理解できませんでした。 反論:CPUサイクルの観点からは効率が悪い場合がありますが、各行はシーケンスを通過するときに1つのことだけを行うため、人間が理解しやすく、追跡しやすいと感じました。私にとって、これは、自分のステーションの各人がやるべき仕事が1つしかない組立ラインがあるような気がします。効率の無視できるトレードオフは、懸念がきちんと分離されたコードによって補償されると感じています。 私の店で聞くFPに対する次の議論は、デバッグするのが難しいということです-それは本当です。Linqコードをステップオーバーするのは簡単ではありません。そして、すぐに見つけられない問題をよりよく追跡して分析するために、メソッドチェーンを解く必要がある場合があります。 _Counter-argument:ほとんどの場合、機能スタイルは読み方がより宣言的であり、エラーが機能チェーン内でスローされると、私は通常、問題をすぐに見つけることができるため、これには問題はありません。 私の質問 私は店で機能的なスタイルを宣伝しようとしてきましたが、私は前進しているとは感じません。私は両方のスタイルのプログラミングを行ってきましたが、最近Haskellに手を出したばかりです。長年の命令的な経験にもかかわらず、私はJavaScriptでFPを日常的に使用しているので、それは私に成長しました。命令型のスタイルにこだわった場合に行ったことと比較すると、コアの正当性のメモが鳴ります。私は脳を機能的思考、機能的構成に向けて再訓練しました。 私が理解できないのは、FPのメリットを他の人に納得させるのがどれほど難しいかです。 たとえば、私のショップの開発者はLinqを使用していますが、通常はドメインデータを処理するコンテキストで使用しています。私はより一般的な意味でそれを使用し、シーケンス/リストまたは永続的なデータ構造を扱うときはいつでもそれを好みます。チームメイトにLinqの使用を拡大するよう説得することができませんでした。 私が理解しようとしているのは、開発者がFPを好まない原因です。 FPの経験が豊富であるが、命令型を支持することに決めた人からの回答を期待したい。機能を使用するのではなく、命令にとどまるという決定を下した理由は何ですか? 命令型プログラミングと関数型プログラミングの違いを強調する追加の例を次に示します。 SelectedRowsLinqでグリッドのメソッドを次のように書きました。 Public Property SelectedRows() As DataRow() Implements IDataSourceControl.SelectedRows Get Return Me.ugrBase.Selected.Rows. OfType(Of Infragistics.Win.UltraWinGrid.UltraGridRow)(). Select(Function(ugr) ugr.ListObject). OfType(Of DataRowView)(). Select(Function(drv) drv.Row). ToArray End Get ただし、このスタイルのコードは一部の開発者を不快にさせるため、当社のリードはそれをより馴染みのあるものに書き換えました。 Public Property SelectedRows() As DataRow() Implements IDataSourceControl.SelectedRows Get Dim plstRows As …

3
依存関係の逆転の原則:「高レベルのポリシー」と「低レベルの詳細」を他の人に定義する方法は?
私は、依存関係の逆転の原則を(ほとんどは後輩の)同僚に説明しようとしています。ソフトウェアの「高レベルポリシー」と「低レベル詳細」を定義するにはどうすればよいですか?たとえば、ソフトウェアが複数のビジネスアプリケーションのワークフローを自動化する場合、ワークフローの自動化が高レベルのポリシーであり、ビジネスアプリケーションが詳細であると言うのはなぜですか?

1
消費者を単体テストするための唯一のソリューションは、サードパーティのコードをラップすることですか?
私は単体テストを行っており、クラスの1つでメソッドの1つからメールを送信する必要があるため、コンストラクター注入を使用Zend_Mailして、Zendフレームワークにあるクラスのインスタンスを注入します。 現在、一部の人々は、ライブラリが十分に安定しており、頻繁に変更されない場合、それをラップする必要はないと主張します。したがって、それZend_Mailが安定しており、変更されず、私のニーズに完全に適合すると仮定すると、そのためのラッパーは必要ありません。 次にLogger依存する私のクラスを見てみましょうZend_Mail: class Logger{ private $mailer; function __construct(Zend_Mail $mail){ $this->mail=$mail; } function toBeTestedFunction(){ //Some code $this->mail->setTo('some value'); $this->mail->setSubject('some value'); $this->mail->setBody('some value'); $this->mail->send(); //Some } } ただし、ユニットテストでは、一度に1つのコンポーネントをテストする必要があるため、Zend_Mailクラスをモックする必要があります。さらに、クラスが抽象ではなく結石に依存するようになったため、依存関係反転の原則に違反してLoggerいます。 Loggerラップせずに単独でテストするにはどうすればよいZend_Mailですか? コードはPHPにありますが、答えはそうである必要はありません。これは、言語固有の機能というよりも設計上の問題です

5
「純粋なオブジェクト指向言語」という用語の正式な定義は?
私はそのような質問を提起するためにSO兄弟の間でより良い場所を考えることができません。もともと「Pythonは純粋なオブジェクト指向言語ですか?」しかし、用語を定義しようとする際に人々が経験するトラブルや不快感を考慮して、用語自体の明確な定義を取得することから始めることにしました。 言葉を作り出したアラン・ケイ博士による通信から始めるのはかなり公平でしょう(細胞または他の生物との生物学的類推のインスピレーションに注意してください)。 タスクにアプローチするには、次の方法があります。 用語を定義するために一意で十分な特定のプロパティを示す(またはそうしない)プログラミング言語をリストして比較分析を行います(ただし、Smalltalk、Scala、Javaなどは可能ですが、IMOはこのように完全には見えません)実りもありません) 正式な定義(またはそれに近い、たとえば、より学術的または数学的なスタイル)を提供します。 具体的な言語のセマンティックコンテキストまたはアプリオリなプログラミングエクスペリエンスに完全に依存する哲学的定義を提供します(コミュニティによる説明が成功する可能性があります)。 私の現在のバージョン:「操作とオペランドを(文法的に)区別し、このタイプがオブジェクト(OOPの意味)であるかどうかを各オペランドのタイプについて推測できる特定のプログラミング(フォーマル)言語がオブジェクトであるこの言語に少なくとも1つのタイプがある限り、そのような言語はオブジェクト指向言語です。最後に、言語のすべてのタイプがオブジェクトでもある場合、そのような言語を純粋な(強い)オブジェクト指向言語と定義します。 それの可能な改善を感謝します。ご覧のように、「オブジェクト」という用語に依存する定義を作成しました(多くの場合、オブジェクトのクラスとして完全に参照されます)。 [編集] また、私はの(幸運にもよく理解)という概念を使用タイプを型付けの言語のように。データ型プログラミングまたは型指向プログラミングは、(プログラムテキスト、つまりリテラルおよびデータ変数の特定の値をどのように処理するか-タイプセーフティに進化するもの)の構文解釈であるだけでなく、言語文法に起因し、正式な方法で研究できる(数学的論理を使用)いわゆる型システムとして。特定の型システムにいわゆるユニバーサル型を要求することは、OO言語の純度を定義する方法の1つです(これを意味的に拡張する方法があります)。 NB 答える方法: 用語や概念の理解をサポート/説明する本または参考文献を指定すると役立ちます(通常、基本を除くすべての依存概念を適切な定義がカバーまたは参照します)。 可能であれば、明確でない場合はインデントされた回答/定義のカテゴリを示します(上記を参照:1-言語の例、2-数学的論理、3-技術的な説明とプログラミング哲学) 分類は重要である(とも用語純粋-OOは、長期OOに含まれているため)他のよく知られた方法論からOOパラダイムのunmix要素に試して答えながら(と決して混乱/それらをオーバーラップする、の例えば通常の要素モジュールをカバーすることができます/オブジェクト指向プログラミングで具体化):OOPと機能プログラミング、論理プログラミング(特に強く専門化された)、Abstarct Data Types(ADT)、Modular、Metaprogramming(generics and LISP's macroexpansion-time)との区別を試みる、契約(例:エッフェル)、アスペクト指向(AO)、(宣言的分類と機能的分類の違い、およびダイクストラの構造化の歴史的定義は明確です) 正式な定義を与えることの難しさ:驚くべきことに、特定の論理(正式な)システムの形式でOOPの数学的な記述を与えることは非常に簡単です(ほとんどの場合、型ベース)。その形式主義を単にエンターテインメントやエクササイズだけでなく、タイプセーフティチェックや新しい言語デザインの側面に適用することにより、より実用的なことを試みることもできます(また、ラムダ計算としてのFOL形式で、直観的型理論、依存型、そして単にカテゴリー理論を使用して)。ここでの主なポイントは、当然のことです多分、一定の割合の発見を除いて-そのような製剤は、IMO強く、最も可能性の高い最初は不完全なので、ほとんどの世界をプログラミングに後方貢献していない((コンピューター・エンジニアリングで)OOPの理解と、その後はほぼアクセスできなくなってしまうことで(不備)バイアスされていることにより、バック正式な世界からの用途一般的な言語に統合されています)。 そうです、定義だけでなく、正確に「良い」定義を与えることは困難です。しかし、皆さんの経験と直接的な関与のおかげで、ここでこれを尋ねることに前向きです。

5
関数型プログラミングの読みやすさ[終了]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 2年前に閉店。 私はこれに興味があります。関数型言語を学ぶ前に思い出したので、それらはすべて恐ろしく、ひどく、ひどく読めないと思っていました。Haskellとf#を知ったので、少ないコードを読むのに少し時間がかかりますが、その小さなコードは命令型言語での同等の量よりもはるかに多いので、純益のように感じ、私は極端ではありません機能的に実践。 ここに私の質問があります。私は、OOPの人々から、機能的なスタイルはひどく読めないと常に聞いています。これが事実であり、自分を欺いているのか、または関数型言語を習得するのに時間がかかったのであれば、スタイル全体がOOPよりも読みにくくなるのではないかと思います。 誰かが証拠を見たり、逸話を手に入れたりして、おそらくこれを言うのに十分な頻度で行っていますか?機能的に実際に書くのが読みにくい場合は、使い続けたくありませんが、そうなのかどうかはわかりません。

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