ソフトウェア工学

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

8
C ++削除とJava GC
Javaガベージコレクションは、ヒープ上のデッドオブジェクトを処理しますが、時々世界を凍結します。C ++ではdelete、作成したオブジェクトをそのライフサイクルの最後に破棄するために呼び出す必要があります。 これdeleteは、非凍結環境に支払うには非常に低価格のようです。関連deleteするすべてのキーワードを配置することは、機械的な作業です。新しいブランチが特定のオブジェクトを使用しなくなったら、コードを移動して削除を実行するスクリプトを作成できます。 では、ガベージコレクションのJavaビルドインとC ++ diyモデルの賛否両論は何ですか。 C ++対Javaスレッドを開始したくありません。私の質問は違います。 この全体的なGCのことは、「単純に、作成したオブジェクトを削除することを忘れないでください。専用のGCは必要ありません。それとも、「C ++でオブジェクトを破棄するのは本当にトリッキーです。私の時間の20%をそれに費やしますが、それでもメモリリークは一般的な場所です」

4
依存関係の逆転によりAPIが拡張され、不要なテストが発生する
この質問は数日間私を悩ませてきました、そしてそれはいくつかの実践が互いに矛盾しているように感じます。 例 反復1 public class FooDao : IFooDao { private IFooConnection fooConnection; private IBarConnection barConnection; public FooDao(IFooConnection fooConnection, IBarConnection barConnection) { this.fooConnection = fooConnection; this.barConnection = barConnection; } public Foo GetFoo(int id) { Foo foo = fooConection.get(id); Bar bar = barConnection.get(foo); foo.bar = bar; return foo; } } これをテストするとき、IFooConnectionとIBarConnectionを偽造し、FooDaoをインスタンス化するときに依存性注入(DI)を使用します。 機能を変更せずに実装を変更できます。 …

1
case / interactorの `execute`メソッドを使用してパラメーターを受け入れる必要があります
クリーンアーキテクチャのほとんどの例(Androidプロジェクトはほとんどですが)では、ユースケース/インタラクタークラス(機能をカプセル化するユニット)が、ここやここのように、基本クラス/インターフェースを共有することが多いことに気付きました。他のものは(hereまたはhereのように)しません。代わりに、インタラクターがいくつかのパラメーターを受け入れることを許可し、その後、いくつかのロジックを実行するために使用されます。 これらのアプローチのいずれかが他よりも優れていますか?たとえば、ユーザー入力を必要とする何かのユースケースをパラメーターなしのアプローチがどのように処理するかに特に興味があります。たとえば、ユーザーにエンティティを編集させてサーバーに渡したいとします。同じエンティティをユースケースとそれを呼び出す人に注入することもできますが、その場合は変更可能である必要があるため、変更は両方の場所に反映されます。ただし、不必要なモデルを作成することはできません(スレッド化の問題などのため)。そのような場合の対処方法は? ユースケース/インタラクターという用語を誤って使用した場合はご容赦ください。ただし、これはAndroidランドでの使用方法であり、確かにデザインパターンで少し遅れている可能性があります。

4
NPCのアニメーションのシーケンスを選択する-動作ツリーを使用しますか?
NPCを実装して、仮想空間、具体的には猫を歩き回っています。一連の短いアニメーションクリップ(3〜5秒)があります。私の最初の本能は、最後のアニメーションが終了したときにランダムなアニメーションを選択することだけでしたが、次のアニメーションが物理的に偶発的な可能性に制限されていても、動作が頻繁に変更されるため、現実的に見えないことに気付きました。 私の意図する解決策は、各アニメーションに次のアニメーションの重み付きリストがある、動作ツリー(http://www.gamasutra.com/blogs/ChrisSimpson/20140717/221339/Behavior_trees_for_AI_How_they_work.php)のようなものです。つまり、猫が歩いている場合、歩き続ける確率は80%、座っている確率は20%、睡眠は0%です。基本的にマルコフモデルを使用して適切な次のステップを取得します。 ただし、これが良い解決策であるかどうかはわかりません。また、現在のアニメーションから次のアニメーションの可能性と確率へのマッピングを生成する方法もわかりません。30のアニメーション* 30の次のアニメーション= 900の重み付け。手動で計算するのは大変です。 猫は障害物にぶつかると反応することがありますが、問題の先を行くと、事前にすべてを選択せず​​に現実的なアニメーションのシーケンスを選択することになります。ツリーには、人への近さ、部屋の場所、最後に食べてからの時間など、他のいくつかの入力もあります。

4
同じタイプのオブジェクトをそれら自体の中で宣言することは受け入れられますか?
以下の例のように、同じオブジェクト内から新しいオブジェクトを宣言(およびそれらを返す)することは許容されますか? または、あるhandlerクラスに移動した方がよいですか? public class Person { public string Name { get; set; } public int Age { get; set; } //Gets a list of persons public List<Person> GetPersons() { List<Person> _listPersons = new List<Person>(); Person _person = new Person(); _person.Name = "FooFii"; _person.Age = 50; _listPersons.Add(_person); return _listPersons; } }

3
重大なAPIの変更:ライブラリユーザーが簡単に移行できるようにするにはどうすればよいですか?
以前は、@DeprecatedAPIバージョンにアノテーションを追加する標準的な方法を使用していましたが、今後のバージョンでは削除されます。 現在、ライブラリのメジャーバージョンを準備しています。多くのAPIパーツが削除され、名前が変更されています。 既存のユーザーが簡単に移行できるようにするには、新しいライブラリバージョンを古いバージョンと並べて使用できると便利な場合があります。 メリット バージョン間の動的切り替えを実装できます 新しいバージョンでバグが見つかった場合、アプリケーションは前のバージョンにフォールバックできます(ベータ段階で役立ちます) これを行うために、私は単純に新しいパッケージに新しいライブラリのバージョンを移動することができcom.mycompany.libraryへcom.mycompany.library.v2 これは一般的な方法ですか、それともこのようなJavaライブラリの並列使用について他の推奨事項がありますか? バックグラウンド: ライブラリはシンプルなドキュメントコンバーターです。そのため、convert(in、out)メソッドのほかに、多くの構成プロパティといくつかのイベントハンドラーがあります。サイドバイサイドの使用法を提供する場合、コンシューマーはそれらを動的にインスタンス化して構成できます。 if (useVersion2) { com.mycompany.library.v2.Converter c = new com.mycompany.library.v2.Converter(); // configure and run c.setOption(...); c.convert(in, out); } else { com.mycompany.library.Converter c = new com.mycompany.library.Converter(); // configure and run c.setOption(...); c.convert(in, out); } (質問は/programming/37192945/から移動しました)

2
「その他」の集合体の状態をどこで検証する必要がありますか?
シナリオ: 顧客が注文し、製品を受け取った後、注文プロセスに関するフィードバックを提供します。 次の集計ルートを想定します。 お客様 注文 フィードバック ビジネスルールは次のとおりです。 顧客は自分の注文についてのみフィードバックを提供でき、他の人のフィードバックは提供できません。 顧客は、注文に対する支払いが済んでいる場合にのみフィードバックを提供できます。 class Feedback { public function __construct($feedbackId, Customer $customer, Order $order, $content) { if ($customer->customerId() != $order->customerId()) { // Error } if (!$order->isPaid()) { // Error } $this->feedbackId = $feedbackId; $this->customerId = $customerId; $this->orderId = $orderId; $this->content = $content; } } ここで、企業が新しいルールを望んでいると想定します。 …

6
mallocの効率と実装の違いは?
私が使用している場合はmalloc、ないmallocにかかわらず、常にそれが配分されているものと同じアルゴリズムを使用するか、それがデータを見て、appriopriateアルゴリズムを選択しますか? より効率的なアルゴリズムを選択することにより、mallocをより速くまたはよりスマートにすることができますか?私のテストではmalloc、テスト結果が正しければ、Ubuntuの組み込み公式システムは学校プロジェクトよりも10倍遅くなります。キャッチとは何ですか?malloc最適化する必要があるため、テストでのパフォーマンスが非常に悪いことに驚いています。常に同じアルゴリズムを使用していますか?のリファレンス実装はありmallocますか?のソースを確認したい場合malloc、どこを見ればよいですか?私が実行するテストは次のとおりです。 /* returns an array of arrays of char*, all of which NULL */ char ***alloc_matrix(unsigned rows, unsigned columns) { char ***matrix = malloc(rows * sizeof(char **)); unsigned row = 0; unsigned column = 0; if (!matrix) abort(); for (row = 0; row < rows; row++) { matrix[row] = …
8 c  performance  malloc 

4
プログラミング言語でゼロから数えることの起源は何ですか?
これは私が長い間疑問に思っていた(そして尋ねられた)質問です。 (ほとんど?すべて?)プログラミング言語では、配列、文​​字列などのインデックスはゼロから始まります。多くの言語で採用され、時間が経つにつれて慣例になったことを認識していますが、だれでもこの起源を指摘できますか? おそらく、それはすべてバイナリに根ざしていることに関係しているのではないかと思いました。しかし、私は10進法での必要性を引き継ぐという考えがわかりません-なぜインデックスを1から始めないのですか? ゼロからインデックスを開始する決定が説明されている可能性があるプログラミング言語の歴史的な知識を持っている人はいますか? ありがとうございました! 編集:ダイクストラの文章は、数学的な観点からさらに役立ちますが、すべての言語がゼロインデックス化されているわけではないことを彼は指摘しました。WBTの説明は、なぜメモリアドレスに基づいてゼロから始めるのかについても理にかなっています。(一部の言語は、配列操作に基づいてわずかに異なるインデックス付けを処理することを知っています。) 私は必ずしも理由を探る必要はありません(理解を深めるのに役立つので非常に感謝しています)が、いつこれが規則になったのか、および/または特定の言語にたどり着くことができるかどうかという線に沿って探します。 したがって、たとえば、K&RのCでは、配列のインデックスについて説明するとき、KまたはRは「配列の添え字は常にCでゼロから始まる...」(p。22)と説明し、後で文字を処理する関数について説明します。配列、「...より有用な設計は、行の長さ、またはファイルの終わりが検出された場合はゼロを返すことです。ゼロは、有効な行の長さになることはないため、許容できるファイルの終わりを返します。」(p.127) K&Rに基づいて、私は次のように収集します。a)規則は他の場所から採用されているため、Cはゼロインデックスの背後にあるインスピレーションではありません。b)2番目の例に基づいて使用する理由はもっと深い可能性があります。私はK&Rがその明確な散文で非常に広く評価されていることを知っています。それが、これを含めるもう1つの理由です。別の文書化された言語がゼロインデックスの背後にある理由を説明するために私が期待したことの例を示すためです。 私はWBTとbtillyの両方が同等に良い理由を提供していると思います。設計の決定を文書化した古い(Cより前の)言語を知っている人はいるかもしれません。同時に、そのような情報が存在しない可能性があることも認識しています。

3
OOP設計の問題。2種類の空のオプション
ホテルの部屋の予約を扱う非常にシンプルなアプリケーションを書いています。ある段階で問題が発生しました。 注文のキューを処理しています。注文ごとに、受付係の1人は、クライアントの戦略に従って部屋(1つまたはまったくなし)を選択する必要があります。それが私がJavaを使うことにした理由Optionalです。問題は、希望する日に空き部屋がない場合は注文をキャンセルする必要があることですが、利用可能な部屋があり、それらのどれもが受付の戦略に適合しない場合は、注文をキューに戻す必要があります。 部屋を選択することは間違いなく受付の義務である必要があります。その問題にクリーンな方法で対処するための最良の方法は何だと思いますか?Optional日付に部屋がない場合、空を返す代わりに例外をスローする必要がありますか?残念ながら、例外は通常、コードフローを制御するための適切なソリューションではありません。 コードフラグメント: Optional<Room> selectedRoom = receptionist.chooseRoom(rooms, order.getQuestionnaire()); boolean decision = selectedRoom .map(room -> receptionist.askClient(order.getClient(), room, order.getQuestionnaire())) .orElse(false); if (shouldProcessAgain(order, selectedRoom.isPresent(), decision)) { orders.add(order); }

2
ログを国際化することは意味がありますか?
ログを国際化するための有効なユースケースは何ですか?特に、Webアプリケーションにとって意味のある用途はありますか。 私はからWebアプリケーションが使用するロギングAPIの変換に取り組んでいるlog4jのをslf4j、インターフェイスが上抽象的に使用されていることに気づいたlog4jの実装をサポートする国際化。また、との両方が国際化log4jをslf4jサポートしていることにも気付きました。 現在、国際化は、エンドユーザーがログを表示できるデスクトップアプリケーションをプログラミングするときに役立ちますが、このロギングファサードは、一般的に英語を使用する必要がある開発者が、いくつかのWebアプリケーションのサーバー側でのみ使用します。 。

3
10以上のプロジェクト間でコードベースを共有し、痛みを最小限に抑える方法は?
同じデータベースで同じデータを共有するアプリケーションがいくつかあります。コードの冗長性を最小限に抑えるために、データアクセス層は共有プロジェクトです。これにより、各プロジェクトが独自のデータアクセスを再コーディングする必要がなくなりますが、これも大きな問題になります。1つのチームがデータレイヤーを更新する必要がある場合、他のすべてのチームは変更をプルしてテストし、変更が何も壊れていないことを確認する必要があります。これは遅くて苦痛なプロセスです。 共有データレイヤーを削除し、各チームに独自のデータレイヤーを管理させるというアイデアについて考えましたが、問題は、すべてのチームが同じデータベースにアクセスするため、テーブルの変更がある場合でも、すべてのチームが関連するコードを更新します。 だから私の質問は、多くのプロジェクトが同じデータソースから追​​い出され、データベースまたはアクセスレイヤーへの変更の痛みを最小限に抑えるように、データとアクセスレイヤーをどのように設計できるでしょうか。

2
キューを使用して関数を分離する/直接呼び出しを避ける?
関数型プログラミングの初心者向けの質問の種類: 私はリッチヒッキーの講演の筆記録をいくつか読んでいますが、彼の有名な講演のいくつかでは、関数を相互に呼び出す代わりにキューを使用することをお勧めしています。(例:デザイン、構成、パフォーマンス、シンプルで簡単) 私はこれを多くの点で完全に理解していません: 彼はデータをキューに入れ、各機能にそれを使用させることについて話しているのですか?したがって、関数Aが関数Bを呼び出して独自の計算を実行する代わりに、関数Bが出力をキューにスラップし、関数Aがそれを取得するようにしますか?または、代わりに、関数をキューに置き、その後それらをデータに順次適用することについて話しているのです(確かにそうではありません。大規模な変更が含まれるためです。そして、マルチアリティ関数のキューの乗算や、ツリーのようなものですか? ) どうすれば物事が簡単になりますか?私の直感は、キューが一種の状態になるため、この戦略はより複雑になると思います。そして、「他の関数がスキューしてデータをキューの上に置くとどうなるか」を心配する必要があります。 SOの実装に関する質問への1つの答えは、アイデアがさまざまなキューの束を作成していることを示唆しています。したがって、各関数はその出力を独自のキュー(??)に入れます。しかし、それも私を混乱させます。なぜなら、関数を一度実行している場合、その出力を取得し、その名前を(var、atom、big inハッシュテーブルなど)。対照的に、関数が複数回実行されていて、その出力をキューに貼り付けている場合は、再び自分に状態を課しているため、すべてが呼び出される順序を心配する必要があり、ダウンストリーム関数は純粋ではなくなります。等 明らかに私はここでポイントを理解していません。誰かが少し説明できますか?

5
設計パターンのオープンクローズの原則
オープンクローズの原則を実際にどのように適用できるかについて、少し混乱しています。時間の経過とともにビジネスの要件は変化します。Open-Closedの原則に従って、既存のクラスを変更する代わりにクラスを拡張する必要があります。クラスを延長するたびに、要件を満たすのは現実的ではないように思えます。列車予約システムの例を挙げましょう。 列車予約システムでは、チケットオブジェクトがあります。通常のチケット、割引チケットなど、さまざまなタイプのチケットが存在する可能性があります。チケットは抽象クラスで、RegularTicketとConcessionTicketsは具象クラスです。すべてのチケットには共通のPrintTicketメソッドがあるため、基本抽象クラスであるチケットで記述されます。これが数か月間うまくいったとしましょう。ここで、チケットのフォーマットを変更するように要求する新しい要件が発生します。印刷されたチケットにいくつかのフィールドが追加されるか、形式が変更される場合があります。この要件を満たすために、次のオプションがあります チケット抽象クラスのPrintTicket()メソッドを変更します。しかし、これは開閉原理に違反します。 子クラスのPrintTicket()メソッドをオーバーライドしますが、これは印刷ロジックを複製します。これは、DRY(自分を繰り返さないでください)の原則に違反しています。 だから質問は オープン/クローズの原則に違反せずに、上記のビジネス要件を満たすにはどうすればよいですか。 クラスが変更のために閉じられることになっているとき?クラスが変更のために閉鎖されていると見なすための基準は何ですか?それは、クラスの初期実装後ですか、それとも本番環境での最初のデプロイメント後か、それとも別の場合があります。

2
MVP(監視コントローラー)ビューはモデルを更新しますか?
私はMVPについて、特にコントローラーの監督について読んでいます。ビューをモデルとどのようにやり取りするかは、頭を抱え込むのが難しい点の1つです。 プレゼンターがモデルを更新する必要があり、ビューがモデルから読み取ることは私の理解でした。プレゼンターは、インターフェイスを介してビューを更新することもできます。これに関するマーティンファウラーの記事は、まさにそれを示しているようです(http://martinfowler.com/eaaDev/SupervisingPresenter.html)。 ただし、他の記事/ブログは、モデルを直接更新するビューを示しています(https://blogs.msdn.microsoft.com/erwinvandervalk/2009/08/14/the-difference-between-model-view-viewmodel-and-other-分離表示パターン/)。 これらは単なるパターンであることを知っているので、さまざまな実装がありますが、モデルを更新するビューは、必要以上に多くのことを行っているようです。 たとえば、名前と電話番号を含む人物クラスがあったとします。ビューには、この名前と番号、および個人の名前と番号を変更するための送信ボタンを表示できます。送信ボタンをクリックすると、ビューではなくプレゼンターで更新が処理されると思います。ただし、私が参照した記事は、ビューがモデルを直接更新できることを提案しています。 それで、ビューはモデルを更新する必要がありますか?それとも、プレゼンターだけが処理する必要がありますか? 編集: MSDN記事のコード: public class PersonalDataView : UserControl, IPersonalDataView { protected TextBox _firstNameTextBox; public void SetPersonalData(PersonalData data) { _firstNameTextBox.Value = data.FirstName; } public void UpdatePersonalData(PersonalData data) { data.FirstName = _firstNameTextBox.Value; } }

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