タグ付けされた質問 「constructors」

6
オブジェクトの適切なインスタンス化に失敗する可能性のあるコンストラクターの作成方法
場合によっては、失敗する可能性のあるコンストラクターを記述する必要があります。たとえば、次のようなファイルパスでオブジェクトをインスタンス化するとします。 obj = new Object("/home/user/foo_file") パスが適切なファイルを指している限り、すべて問題ありません。ただし、文字列が有効なパスでない場合は、問題が発生するはずです。しかし、どのように? あなたは出来る: 例外を投げる nullオブジェクトを返します(プログラミング言語でコンストラクタが値を返すことができる場合) 有効なオブジェクトを返しますが、そのパスが適切に設定されなかったことを示すフラグが付いています(ugh) 他の? さまざまなプログラミング言語の「ベストプラクティス」がこれを異なる方法で実装すると思います。たとえば、ObjCは(2)を好むと思います。ただし、(2)は、コンストラクターが戻り型としてvoidを持たなければならないC ++で実装することは不可能です。その場合、(1)が使用されると考えます。 選択したプログラミング言語で、この問題の処理方法とその理由を説明できますか?

2
暗黙的に別のクラスに変換することのみを目的とするクラスを作成するのは悪いことですか?
Circleオブジェクトを作成できるライブラリを使用していて、円の半径と中心を指定してオブジェクトを定義できる状況を想像してみてください。ただし、何らかの理由で、必要なflavourパラメーターも受け取ります。ここCircleで、自分のアプリで本当に使用する必要があるとしましょう。ただし、アプリの目的で、フレーバーをFlavours.Cardboard毎回に設定できます。 この「解決」をするために、私は自分の作成Circleのみとり異なる名前空間でクラスをradiusし、centerパラメータとしてではなく、外部ライブラリのへの暗黙のコンバータがあるCircleだけで作成したクラスCircle(this.radius, this.center, Flavours.Cardboard)のオブジェクトを。したがって、他のタイプのが必要なすべての場所でCircle、自動変換を実行します。 そのようなクラスを作成するとどうなりますか?より良い解決策はありますか?私のアプリケーションが、この外部ライブラリの上に構築されたAPIであり、他のプログラマーが使用することを目的としていた場合、何か違いはありますか?

3
テスト用のプライベートセッターによるプロパティのスタブ
オブジェクトがあります public class MyObject{ protected MyObject(){} public string Property1 {get;private set;} public string Property2 {get;private set;} public string Property3 {get;private set;} public string Property4 {get;private set;} public string Property5 {get;private set;} public string Property6 {get;private set;} public string Property7 {get;private set;} public string Property8 {get;private set;} public string Property9 {get;private …

4
CQRS + ESのオブジェクトはどこで完全に初期化する必要がありますか:コンストラクター内、または最初のイベントを適用するとき?
OOPコミュニティでは、クラスコンストラクターがオブジェクトを部分的または完全に未初期化のままにしてはならないという合意が広まっているようです。 「初期化」とはどういう意味ですか?大まかに言えば、新しく作成されたオブジェクトを、そのクラスのすべての不変条件が保持される状態にするアトミックプロセス。これはオブジェクトに最初に発生するものであり(オブジェクトごとに1回だけ実行する必要があります)、初期化されていないオブジェクトを取得することは許可されません。(したがって、クラスコンストラクターでオブジェクトの初期化を正しく実行するための頻繁なアドバイスです。同じ理由で、Initializeメソッドはしばしばアトミック性を分解し、まだ使用されていないオブジェクトを取得して使用することを可能にするため、眉をひそめられます明確な状態にあります。) 問題: CQRSとイベントソーシング(CQRS + ES)を組み合わせると、オブジェクトのすべての状態変化が順序付けられた一連のイベント(イベントストリーム)でキャッチされ、オブジェクトが実際に完全に初期化された状態にいつ到達するのか疑問に思います。クラスコンストラクターの最後、または最初のイベントがオブジェクトに適用された後? 注:「集約ルート」という用語の使用は控えています。必要に応じて、「オブジェクト」を読むたびに置き換えてください。 議論の例:各オブジェクトが何らかの不透明なId値(GUIDと考える)によって一意に識別されると仮定します。そのオブジェクトの状態変化を表すイベントストリームは、同じId値によってイベントストアで識別できます(正しいイベントの順序については心配しないでください)。 interface IEventStore { IEnumerable<IEvent> GetEventsOfObject(Id objectId); } さらに、2つのオブジェクトタイプCustomerとがあると仮定しますShoppingCart。焦点を当てましょうShoppingCart:作成されたとき、ショッピングカートは空であり、正確に1人の顧客に関連付けられている必要があります。最後のビットはクラス不変です:にShoppingCart関連付けられていないオブジェクトはCustomer無効な状態です。 従来のOOPでは、コンストラクターでこれをモデル化できます。 partial class ShoppingCart { public Id Id { get; private set; } public Customer Customer { get; private set; } public ShoppingCart(Id id, Customer customer) { this.Id = id; this.Customer = customer; } …

4
「オブジェクトコンストラクター」は「名前が「object」の関数で、タイプが「object」を返す」の短い名前ですか?
つまり、関数とコンストラクタの呼び出しに違いがある以上に、単語を選択するということです。「オブジェクトのコンストラクタ」という名前のオブジェクトは、「名前をobject返す型を持つ関数」という名前でもかまいませんobject。 C ++では同じ関数と型名を使用できないと主張する人もいます。ただし、そのための回避策があります。C ++には特別な構文糖(コンストラクターと呼ばれます)があり、これを使用してobjecttypeを返す名前の関数を作成できますobject。ですから、コンストラクタは自立関数として見られ、使用できると思います。 ここに欠けている重要な意味上の違いはありますか?

5
明示的なコンストラクターを定義した場合、デフォルトのコンストラクターが生成されないのはなぜですか?
class Employee{ String name; int id; //No explicit constructors } これで、次のステートメントを呼び出すことができます。 Employee e1 = new Employee(); 上記のコードを使用すると、コンパイラーはコンストラクターの定義を提供しますEmployee()。 次のように単一の明示的なコンストラクタを定義した場合: class Employee{ String name; int id; Employee(String aName){ this.name=aName; } } さて、次のステートメントを呼び出せないのはなぜですか。 Employee e2 = new Employee(); コンパイラはの定義を提供する方法を知っていますがEmployee()。 さて、明示的なコンストラクタを定義したのにEmployee(String aName)、なぜデフォルトのコンストラクタを使用できないのですか? また、コンパイラーが明示的なコンストラクターを定義した後でもデフォルトのコンストラクターの使用を許可した場合は、デフォルトのコンストラクターのコードを再利用するのに役立ちます。

4
C#でのコンストラクターの結果の確認
これと同様の方法で、nullのコンストラクターの結果をチェックする癖がある同僚とコードベースの作業をしています。 Person p = new Person(); if (p != null) { p.Name = "John Smith"; } .NETランドスケープについての私の理解は、例外がスローされない限り、コンストラクターは割り当てを満たされないままにしないということです。したがって、上記の場合、nullチェックは役に立ちません。いずれかpが割り当てられる、または例外は、プロパティセッターをスキップさせるスローされます。 ついでにこれについて同僚に尋ねたところ、「念のため」という言葉に沿って受動的な答えを得ました。私はこの種の「パロニアプログラミング」が好きではありません。読みやすさが損なわれ、不必要に循環的複雑度が増すと思います。このため、この行為の中止を正式に要請したいと思います。これは合理的な要求ですか?何か不足していますか?

1
大きな静的初期化子はコードの匂いですか?
SimpleExpandableListAdapterAndroidで拡張しています。Androidのアダプターは、コンストラクターにかなり複雑な引数が多数あり、セッターやビルダーがないため、あまりうまく実装されていないと思います。私のクラスでは、これらの引数のほとんどは呼び出し元のクラスに依存していないため、内部的に構築したいと思います。ただし、引数はネストされたListsであり、プログラムで構築する必要がある整数と文字列の配列です。 superコンストラクタの前に何もsuper呼び出すことができず、呼び出しが戻る前にインスタンスメソッドを呼び出すことができないため、現在、呼び出しから呼び出す静的メソッドがいくつかありsuperます。 super(getContext(), initGroupData(), groupLayout, initGroupFrom(), initGroupTo(), initChildData(), childLayout, initChildFrom(), initChildTo()); これを処理する方法は3つあります。今と同じように静的メソッドを呼び出す、おそらくこれらの同じメソッドを呼び出して静的変数を初期化して静的変数を初期化する大きな静的イニシャライザを使用するsuperか、これらのメソッドをすべてビルダーにカプセル化します。 今はビルダーに傾いていると思いますが、これを処理するためのより良い方法があるかどうか疑問に思っています。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.