ソフトウェア工学

システム開発ライフサイクル内で働く専門家、学者、学生向けのQ&A

2
ソフトウェアアプリケーションの異なる部分をきれいに分離する方法は?
多くのビジネスロジックを処理する新しいアプリケーションを設計しています。 時間の経過とともにこのようなシステムに潜入することが多い、さまざまなアプリケーションレイヤー間の通常の絡み合いを回避するために、最初から問題の明確な分離を実装したいと思います。大まかに言えば、私は分離したいです: プレゼンテーション層 ビジネスロジックレイヤー データストレージと永続化レイヤー 私が最も苦労しているのは、特にビジネス層とデータ層の間で、実際にエッジで動作をきれいに実装する方法です。データレイヤーがORMオブジェクトをコアレイヤーに渡し、ビジネスロジックをORMに効果的に密結合するアプリケーションが多すぎます。 ORMオブジェクトをシリアル化された形式(JSON?)に変換してから、ビジネスレイヤーでそれを非シリアル化して、そのレイヤー内部のデータ構造にする必要がありますか?それは多くのオーバーヘッドではありませんか? 中規模アプリケーションの懸念の分離をきれいに実装するにはどうすればよいですか?何かアドバイス?

1
オプションvs設定vs設定?それらは何を意味し、何のためにそれらを使用すべきですか?[閉まっている]
休業。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善してみませんか?この投稿を編集して、事実と引用で回答できるように質問を更新してください。 3年前休業。 さまざまなプログラム全体で、ほとんどの場合、次のメニュー項目があります。 Preferences Firefox クロム Gedit シナプス(Settingsメニュー列の下) Hexchat(Settingsメニュー列の下) Gnomeターミナル サンダーバード リズムボックス 頻度は低いものの: Options QtCreator それほど頻繁ではありません: Settings Gvim クロム 設定が最も使用されているようですが、一部のプログラムにはありません。用語は同義語ですか、それともそのようなラベルがどこにつながることになっているのかについて区別する必要がありますか?

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

7
なぜ未使用の変数がそのような問題なのですか?
ある日、未使用の変数の警告を消去していましたが、熟考し始めました。それらの問題は何ですか? 実際、それらの一部はデバッグにも役立ちます(例:例外の詳細を調べる、または返される前に戻り値を確認する)。 私はそれらを持っていることで本当の実際のリスクを見つけることができませんでした。 例 次のような他のプログラマーの注意を引く時間がかかる行を意味するのではありません。 int abc = 7; それは明らかな冗長性と注意散漫です。私は次のようなものを意味します: try { SomeMethod(); } catch (SomeException e) { // here e is unused, but during debug we can inspect exception details DoSomethingAboutIt(); }

1
多層プロジェクトでは、インターフェイスをどこに定義する必要がありますか?
3つのサブプロジェクト(データアクセスプロジェクト、ビジネスロジックプロジェクト、プレゼンテーションプロジェクト)で構成される多層プロジェクトがあります。インターフェイスをどこに定義すればよいですか?DALとBLLの両方で定義されたインターフェイスがあるはずだと思います。インターフェイスに基づく「テスト」データを使用してビジネスロジックレイヤーをテストする状況では、おそらく、インターフェイス? これをどのように配置すべきかに関するベストプラクティスまたはアイデアはありますか?

2
サービスの構成変更をテストする方法は?
新しい構成を追加するときにサービスをテストする最善の方法は何ですか?たとえば、私のサービスは顧客にサービスを提供し、顧客の構成に基づいて、異なるタイプのサービスを提供します。たとえば、顧客が特定の通貨を選択した場合、別の通貨と比較して20%の割引が提供されます。 上記の例は重要ではありません。重要なのは、CI \ CDを行うときに人々がとるアプローチです 割引を計算するロジックはドメイン内にあり、その周りに単体テストがあります。私の質問は、割引を把握するためにさまざまなルールで構成されたマーチャントがいる場合(すべて構成に基づいており、ドメインがそれを解決する場合)、構成を変更する要求が来た場合、どのように確認しますか? もっとテストを書きますか? 単体テストと同じようにテストしませんか? 変更を手動でテストしますか? その他の 私は多くの記事と共にxUnitテストパターンとテスト駆動開発の本を読みましたが、人々がこれをどのように管理するか(サービス内の構成変更と正確性の検証)に遭遇していません。 私はこれが継続的デリバリー・ブックで扱われるのを見ません。

2
単体テストが相互に依存することは悪い習慣ですか?
私がこのようなユニットテストを持っているとしましょう: let myApi = new Api(); describe('api', () => { describe('set()', () => { it('should return true when setting a value', () => { assert.equal(myApi.set('foo', 'bar'), true); }); }); describe('get()', () => { it('should return the value when getting the value', () => { assert.equal(myApi.get('foo'), 'bar'); }); }); }); だから今私は2つの単体テストを持っています。APIで値を設定します。もう1つのテストでは、適切な値が返されることを確認します。ただし、2番目のテストは最初のテストに依存しています。2番目のテストが他に依存していないことを確認するという唯一の目的.set()で、2番目のテストの前にメソッドを追加する必要get()がありますか? …

3
副作用がある関数の命名規則?[閉まっている]
休業。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善してみませんか?この投稿を編集して、事実と引用で回答できるように質問を更新してください。 3年前休業。 彼らの言語には、状態を変化させる関数の名前が感嘆符で終わらなければならない慣習があると誰かが言うのを聞いた 私はもっ​​と機能的なコードを書こうとしているのですが、副作用ステータスに従って関数を何とかマークするアイデアが好きです。つまり、なし、内向きの副作用、外向きの副作用(私は正しいfp用語を知らないですが、望む)。 自分の命名スキームを思いつくのは簡単ですが、そのようなスキームや慣習がホームベイクする前にすでに存在しているかどうか疑問に思っていました。 編集:すべての回答に感謝します。それはまさに私が求めていたものであり、それらはすべて本当に有用であることがわかりました。おそらく、古いJavaScriptをリファクタリングしているので、静的に型付けされた言語では、副作用のあるコードとないコードの違いを強制できるかもしれないが、自分で付けた命名規則に頼らなければならないでしょう。 edit2:これを主にオピニオンベースとして閉じるmodについては、私は同意しなければなりません。私は、もしあれば、どのような慣習が一般的に使用されているのかを尋ねていました-これは誰かの定義によると、意見ではなく事実の問題です!

1
フィルタリングロジックは、リポジトリまたはサービス内にある必要がありますか?
私は次のことを考えています。エンティティを検索するためのフィルタリング機能が必要なシステムを構築しているとします。たとえば、エンティティをリストするテーブルにフィルタリングを適用して何かを見つけたり、それを使用してフィルタリングされたセットに関するレポートを生成したりすることができます。 重要なのは、フィルタリングロジックをどこかに置く必要があるということです。これを行う1つの悪い方法は、必要に応じてフィルタリングロジックを複製することです。私はそれを一度やったことがあり、それはひどい考えです。 一方、Filter(FilteringOptions filteringOptions)フィルタリング操作を実行してエンティティのフィルタリングされたリストを返すように設計されたようなメソッドがあるはずです。 今、私見、フィルタリングロジックは一種のビジネスロジックです。ビジネスエキスパートは、フィルタリングがどのように行われるか、何がどのようにフィルタリングされるかを知っている人です。そのため、フィルタリングロジックはドメインレイヤーに配置する必要があります。 これを行うための2つのオプションが見つかりました。その特定のエンティティに対応するリポジトリにフィルタリングメソッドを埋め込むか、またはEntityNameSearchServiceリポジトリを使用してフィルタリングを実行するようなドメインサービスを作成します。 どちらがより良い方法であるか私はまだ混乱しています。では、DDDを適切に使用しようとしている場合、このフィルタリングロジックはどこにあるべきでしょうか。リポジトリまたは別のサービスで?

6
Cでは、*は演算子ですか、それとも宣言の型の一部ですか?
Cでは*、間接演算子または間接参照演算子と呼ばれます。ステートメントで使用した場合の動作を理解しています。*por * pは、単項演算子であることを考えると、意味があります。 ただし、宣言で*は、a が使用されることがあります。 void move(int *units) { ... } または int *p = &x; ここで演算子を使用しているのは不思議です。次のようなことはできません void move(int units++) { ... } どこ++にも単項演算子です。これ*は間接演算子でも*ありますか、それともポインタの型について何かを言っている別の意味がありますか?(これが当てはまる場合、私はたとえばint* units宣言などで使用することを検討していますが、int x = *p;それ以外は明確にするためです。) で、この答えはと言われています C標準では、*演算子に対して2つの意味のみを定義しています。 間接演算子 乗算演算子 これ*は実際にはタイプの一部であると主張する人々も見ました。これは私を混乱させます。
9 c  pointers  operators 

3
プロパティが暗黙的にデリゲートに変換できないのはなぜですか
C#のプロパティは、実際の単純な古いメソッドにコンパイルされることは誰でも知っています。しかし、method(-group)とは異なり、Func<T>orまたはAction<T>(getterおよびsetter)のようなデリゲートを期待する他のメソッドへの引数としてそれらを与えることはできません。これを禁止する特別なものはありますか、それともメソッドグループをデリゲートに暗黙的に変換可能にするときに「無料」で提供されなかった機能だけですか? コード例: public class MyClass { public static int X { get; set; } } private static void Foo<T>(Func<T> f) { Console.WriteLine(f()); } private static void Bar<T>(Action<T> f) { f(default(T)); } private static void Test() { // neither of these lines compile, even with an explicit type-cast. Foo(MyClass.X); Bar(MyClass.X); } …

2
単体テストでプロジェクトを「使用」するか、それとも同じ名前空間を持っていますか?
バックグラウンド C#.NETでプロジェクトに取り組んでいますが、Visual Studioのソリューションに新しい単体テストプロジェクトを追加しました。私がこれをいつもやっている方法は: 新しい単体テストプロジェクトを作成します。 そのプロジェクトに、テスト中のプロジェクトへの参照を含めます。 プロジェクトを含める(using)だけです。 あなたができる他の方法は... 新しい単体テストプロジェクトを作成します。 そのプロジェクトに、テスト中のプロジェクトへの参照を含めます。 作るユニットテストプロジェクトが持つ名前空間を共有テスト中のプロジェクトを。 質問 .NETの世界のプロジェクトでこれを行うための受け入れられた方法はありますか、またはこれは単なる意見であり、それ以上のものはありませんか?

5
Javaで同等の慣用的なパターンマッチング
いくつかのイベントを解析してSTDIN「実行」するシミュレータを構築しています。私のバックグラウンドは、最近のほとんどが関数型プログラミングであるため、次のようなことをするのは自然なことのようです。 data Event = Thing1 String Int | Thing2 Int | Thing3 String String Int Parse :: String -> [Event] Simulate :: [Event] -> [Result] シミュレートする場所 case event of Thing1 a b => compute for thing one | Thing2 a => compute for thing two などJavaでこの種のことをする慣用的な方法は何ですか?グーグルで私はネストされたクラスとビジターパターンの方向を指摘されましたが、私の試みではそれはかなり重いようです。型消去は、私と一生懸命戦っているようです。正しく行われるように見えるものの概要を教えていただけますか?

2
制約付きのジョブキューを最適に設計するにはどうすればよいですか?
次の状況を考慮してください。 処理する必要のある多数の「ジョブ」を作成し、それらをキューに入れるプログラムがあります。 他のワーカープログラムで次の「ジョブ」を取得して、そのジョブを処理できるようにします。 各ジョブにはカテゴリがあります。 カテゴリはいくつあってもかまいません。 同じカテゴリの2つのジョブを別々のワーカーで同時に処理することはできません。 ワーカーは一度に1つのジョブを処理できます。 同じカテゴリの複数のジョブが同時に処理される可能性があるため、この状況では従来のキューは機能しませんが、これは許可されていません。 取得するジョブをワーカーに確認させ、そのジョブカテゴリに現在処理中の別のワーカーがあるかどうかを確認し、そうである場合は後で処理するためにジョブをキューに再送信します。これは、この問題を解決する非効率的な方法のようです。この問題を解決できるデータ構造または設計パターンはありますか? さらに説明が必要な場合は、お知らせください。

4
ネストされた関数呼び出しの使用は悪いことですか?
最近の宿題でuglyReceipt(cashParser(cashInput()))は、プログラム自体が完璧に機能する醜い方法で関数を呼び出すことになりましたが、それでも何か間違ったことをしているように感じました。 関数の呼び出しはこのような悪い習慣であり、そうであれば、代わりに何をすべきですか?

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