ソフトウェア工学

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

9
依存性注入:フレームワークを使用する必要がありますか?
私は最近、依存関係の注入を頻繁に行うPythonプロジェクトに取り組みました(アプリをテスト可能にするために必要なため)が、フレームワークは使用しませんでした。すべての依存関係を手動で接続するのは少し面倒ですが、全体的にはうまくいきました。 オブジェクトを複数の場所で作成する必要があった場合、実稼働インスタンスを作成する関数(場合によってはそのオブジェクトのクラスメソッド)が必要でした。この関数は、そのオブジェクトが必要になるたびに呼び出されました。 テストでは、同じことを行いました。オブジェクトの「テストバージョン」を複数回作成する必要がある場合(つまり、モックオブジェクトに裏付けられた実際のインスタンス)、この「テストバージョン」を作成する機能がありました。クラスで、テストで使用されます。 私が言ったように、一般的にこれはうまくいきました。 私は現在、新しいJavaプロジェクトに参加しています。DIフレームワークを使用するか、DIを手動で実行するかを決定しています(前のプロジェクトのように)。 DIフレームワークでの作業がどのように異なり、手動の「バニラ」依存性注入よりも優れているか悪いかを説明してください。 編集:私も質問に追加したいと思います:フレームワークなしで手動でDIを行う「プロレベル」プロジェクトを目撃しましたか?

6
イテレータパターン-内部表現を公開しないことが重要なのはなぜですか?
C#Design Pattern Essentialsを読んでいます。現在、イテレータパターンについて読んでいます。 私は実装方法を完全に理解していますが、重要性を理解していないか、ユースケースを見ていません。この本では、誰かがオブジェクトのリストを取得する必要がある例を示しています。IList<T>またはなどのパブリックプロパティを公開することでこれを行うことができますArray。 本は書いている これに伴う問題は、これら両方のクラスの内部表現が外部プロジェクトに公開されていることです。 内部表現とは何ですか?実際にはそれがありますarrayかIList<T>?消費者(これを呼び出しているプログラマー)がこれを知るのが悪い理由が本当にわかりません... この本は、このパターンが機能を公開することでGetEnumerator機能するため、GetEnumerator()この方法で「リスト」を呼び出して公開できると述べています。 特定の状況では、このパターンには(すべてのように)場所があると思いますが、どこで、いつ見るかわかりません。

5
明示的なキャスト演算子の使用は合理的ですか、それとも悪いハックですか?
私には大きなオブジェクトがあります: class BigObject{ public int Id {get;set;} public string FieldA {get;set;} // ... public string FieldZ {get;set;} } そして、特殊なDTOのよ​​うなオブジェクト: class SmallObject{ public int Id {get;set;} public EnumType Type {get;set;} public string FieldC {get;set;} public string FieldN {get;set;} } 個人的には、BigObjectをSmallObjectに明示的にキャストするという概念を見つけます-それは一方向のデータ損失操作であることを知っている-非常に直感的で読みやすいです: var small = (SmallObject) bigOne; passSmallObjectToSomeone(small); 明示的な演算子を使用して実装されます: public static explicit operator …

3
カレンダー/計画アルゴリズム
問題に直面しているので、どのようにアプローチしたらよいかわかりません。従業員のカレンダーを作成する必要があります。各従業員には特定の仕事上の制約があります(個人的なもの、一般的なもの) 私が取り組んでいるもの: 医者がいます 各医師は週5日勤務する必要があります。 各医師は週に1晩働く必要があります 各医師は、他の医師と比較して(または可能な限り近く)夜同じ時間働く必要があります。 各医師は、他の医師と同等の(または可能な限り近い)木曜日の夜と日曜日の夜に同量の仕事をしなければなりません。 一部の医師は特定の日/夜に作業できない(ユーザーによる入力) 一部の医師は、特定の日/夜に作業したい(ユーザーによる入力) 一部の医師は、特定の日/夜に仕事をしたくない(ユーザーによる入力) 問題のユーザーはカレンダーを扱っている人です。すべての制約に従うカレンダーを自動的に生成するソリューションを構築しようとしています。解決策は、各医師に「医師を追加」と「制約を追加」を入力し、次に「カレンダーを生成」ボタンを入力するだけの大きな設定です。それはユーザーにとって本当に基本的なものです。 私の問題 : 実際の計画をどのように生成するかわからない。ニューラルネットワークや遺伝的アルゴリズムなどについて読んでいるが、それらはすべて正しい解決策のように思えるが、実際にはそうではない。 GAを見ると、与えられた母集団(私の問題)の解を見つけるように作られていますが、開始母集団は与えられた制約のセットに既に従わなければなりません。その場合、私の最初の人口はすでに解決策です。「最適化」する必要はありません。1人の人が月曜日の3晩連続して働くことは問題ではありません。実際に正しい場合、他の人が同じ量で働く場合は、他の人もある時点で月曜日の3日間働くことは問題ありません。私の問題はすでにGAの開始点で解決されているので、GAは私にとって「高度」であると思うようになります。 しかし、再び、GAは本当にこれのために作られたように見えるので、私はそれを正しく理解していないかもしれませんか? とにかく、GA(またはニューラルネットワークなど)を使用したことはないので、そのような学習曲線を作成する前に、正しいアプローチを選択してください。 私の質問 : 私のような問題に対する良いアプローチ/アルゴリズム/テクニックは何だと思いますか?ガス?ニューラルネットワーク?まったく違う何か? 私はすべての耳であり、必要に応じて詳細を開いていますが、私は自分自身をかなり明確にしたと思います:)

6
RESTfulではないHTTP APIを呼び出すもの [閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 4年前に閉鎖されました。 HTTPベースのAPIと呼び、URIを使用してリソースとHTTP動詞(PUT、POST、DELETE、GET ...)に名前を付け、それらのリソースを操作しますか? ロイ・フィールディングの苦情によると、ハイパーメディアがないため、RESTではありません。 内部的には、私のチームでは、誰もが「REST API」と呼んでいます。私はそれを「RESTライク」と呼んでいますが、説明的ではなく、その意味はあいまいです。RESTについては大きな意見の相違があるため、私はそれについてかなり混乱しています。火炎戦争に参加したくないのですが、正しい用語を使用してください。
24 terminology  rest  api  http 

2
最小数の比較で2つのソートされた配列をマージするアルゴリズム
サイズnおよびmのタイプTの 2つのソートされた配列a、bが与えられます。2つの配列を(最大サイズn + mの)新しい配列にマージするアルゴリズムを探しています。 安価な比較操作がある場合、これは非常に簡単です。1つまたは両方の配列が完全に走査されるまで、最初の要素が最も低い配列から取り出し、残りの要素を追加します。このようなもの/programming/5958169/how-to-merge-two-sorted-arrays-into-a-sorted-array ただし、2つの要素を比較すると、ソース配列からターゲット配列に要素をコピーするよりもはるかに高価な場合、状況は変わります。たとえば、大きな任意精度の整数または文字列の配列があり、比較が非常に高価になる場合があります。配列の作成と要素のコピーは無料で、コストがかかるのは要素を比較することだけだと考えてください。 この場合、要素比較の最小数で 2つの配列をマージします。以下に、単純なマージアルゴリズムよりもはるかに優れた機能を発揮できるいくつかの例を示します。 a = [1,2,3,4, ... 1000] b = [1001,1002,1003,1004, ... 2000] または a = [1,2,3,4, ... 1000] b = [0,100,200, ... 1000] 次のように、単純なマージアルゴリズムが最適になる場合があります。 a = [1,3,5,7,9,....,999] b = [2,4,6,8,10,....,1000] したがって、アルゴリズムは、配列がインターリーブされている場合、または少なくとも大幅に悪化していない場合に、理想的には正常に低下し、最大n + m-1回の比較を実行する必要があります。 サイズの違いが大きいリストに対しては、バイナリ検索を使用して、小さな配列の要素を大きな配列に挿入することで、かなりうまくいくはずです。しかし、両方のリストが同じサイズでインターリーブされている場合、それは適切に低下しません。 要素で利用できるのは(合計)順序関数のみであるため、比較を安価にするスキームは不可能です。 何か案は? 私はScalaでこのビットを思いつきました。比較の数に関しては最適であると思いますが、それを証明する能力を超えています。少なくとも、私が文献で見つけたものよりもずっと簡単です。 そして、最初の投稿以来、これがどのように機能するかについてのブログ投稿を書きました。


5
'uint'および 'short'データ型が標準のint(32)よりも適切な場合はどれですか?
能力と価値観の違いを理解できますが、それが適切かどうかに関係なく、常に使用しているように見えInt32ます。uint多くの場合、負にならない値(データベースレコードのIDを表すなど)を記述するため、より適切な場合でも、署名なしバージョン()を使用することはありません。また、short/Int16値の必要な容量に関係なく、誰も使用していないようです。 客観的に、それが使用することをお勧めします場合があることuintやshort/Int16、彼らであり、そうであれば、?
24 c# 

4
体系的にプログラミング言語を選択する[非公開]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 5年前に閉鎖されました。 言語を選択するための方法論を探しています。私は言語について意見を求めているのではありません。私は、ショップの現在の言語を他の利用可能な言語と比較するプロセスを任されました。弊社はウェブ開発ショップです。 当社のCEOは、利用可能なすべてのWebベースの言語、それらが派生した親言語(たとえば、jspはjavaから、c / c ++から)についての完全なホワイトペーパーを求めています。特定の言語のすべての重要な要素とその特定の言語の欠点を含むマトリックスを作成する必要があります。言語はプラットフォームによって制限されていますか、関数型プログラミング、手続き型またはオブジェクト指向向けに設計されていますか?または、プログラミングパラダイムで使用できますか? また、特定の言語の人材プールのサイズや、そのプールの給与の中央値など、技術的ではない情報も必要です。マーケットプレイスは私たちの選択をどのように見ますか? これらすべてを理解するのに役立つコンサルタントを探し始めましたが、ほとんどのコンサルタントは開発のバックグラウンドから来ていることがわかりました。多くの場合、答えは「xxxは最高の言語だからです。過去n年間で最も多く使用してきましたが、私を失望させたことはありません。フロントエンドにyyyを追加し、zzzライブラリを使用できます」 私はこのタスクに圧倒されており、CEOが求めているものを考えると、学界の世界を見て、実際の開発経験のない教授を雇って私たちを「教える」ことが最善の行動であると感じていますすべての可能な言語について。 他の誰かがこの演習を行わなければなりませんでしたか?持っている場合、プロセスを実行するために使用した手順や方法論を共有できますか?

10
OOPで循環参照が必要と思われるこの実世界のアクティビティをモデル化する適切な方法は何ですか?
私は循環参照に関するJavaプロジェクトの問題に取り組んできました。私は、問題のオブジェクトが相互に依存しており、お互いについて知る必要があると思われる現実の状況をモデル化しようとしています。 このプロジェクトは、ボードゲームをプレイする一般的なモデルです。基本クラスは非特定ですが、チェス、バックギャモン、その他のゲームの特定に対処するために拡張されています。11年前、これを6種類のゲームを備えたアプレットとしてコーディングしましたが、問題は循環参照でいっぱいだということです。当時、私は単一のソースファイルにすべての絡み合ったクラスを詰め込むことでそれを実装しましたが、私はそれがJavaでは悪い形であるという考えを得る。ここで、Androidアプリと同様のものを実装し、適切に処理したいと考えています。 クラスは次のとおりです。 RuleBook:ボードの初期レイアウト、最初に移動した人などのその他の初期ゲームの状態情報、利用可能な移動、提案された移動後のゲームの状態に何が起こるか、などの評価などについて質問できるオブジェクト現在または提案されている取締役会の位置。 ボード:ゲームボードの単純な表現で、移動を反映するように指示できます。 MoveList:Moveのリスト。これは、特定のポイントで利用可能な動きの選択、またはゲーム内で行われた動きのリストの2つの目的です。それは2つのほぼ同一のクラスに分割できますが、それは私が尋ねている質問とは関係がなく、さらに複雑になるかもしれません。 移動:1回の移動。移動に関するすべてが原子のリストとして含まれています。ここからピースを拾い、そこに置き、そこからキャプチャしたピースを削除します。 状態:進行中のゲームの完全な状態情報。ボードの位置だけでなく、MoveList、および現在誰が移動するかなどの他の状態情報。チェスでは、各プレイヤーのキングとルークが移動したかどうかを記録します。 循環参照はたくさんあります。たとえば、RuleBookは特定の時間にどの動きが利用可能かを判断するためにゲームの状態を知る必要がありますが、ゲームの状態は最初の開始レイアウトと1回の動きに伴う副作用についてRuleBookに問い合わせる必要がありますそれが行われます(たとえば、次に移動する人)。 新しいクラスのセットを階層的に整理してみました。RuleBookはすべてを知る必要があるため、最上位にあります。しかし、これにより、多くのメソッドをRuleBookクラスに移動する(移動するなど)必要があり、モノリシックになり、RuleBookがどうあるべきかを特に表しません。 これを整理する適切な方法は何ですか?RuleBookをBigClassThatDoesAlmostEverythingInTheGameに変換して、循環参照を回避し、実際のゲームを正確にモデル化する試みを放棄する必要がありますか?または、相互に依存するクラスに固執し、コンパイラーに何らかの方法でそれらをコンパイルさせ、実世界のモデルを保持する必要がありますか?または、私が欠落している明らかな有効な構造がありますか? あなたが与えることができる助けをありがとう!

6
なぜレクサーを2Dアレイと巨大なスイッチとして実装するのですか?
私は学位を取得するためにゆっくりと取り組んでおり、この学期はCompilers 101です。DragonBookを使用しています。まもなくコースに入り、語彙分析と、決定論的有限オートマトン(以下、DFA)を介してそれを実装する方法について説明します。さまざまなレクサーの状態を設定し、それらの間の遷移を定義します。 しかし、教授と本は両方とも、巨大な2D配列(1つの次元としてのさまざまな非終端状態、および他の可能性のある入力シンボル)に相当する遷移テーブルと、すべての端子を処理するswitchステートメントを介して実装することを提案していますまた、非終端状態の場合は遷移テーブルにディスパッチします。 理論はすべて良好で優れていますが、実際にコードを何十年も書いた人として、実装は下手です。それはテスト可能ではなく、保守可能でもなく、読み取り可能でもなく、デバッグするのに苦労します。さらに悪いことに、その言語がUTFに対応していれば、どのように実用的であるかわかりません。非終端状態ごとに100万程度の遷移テーブルエントリがあると、急いで扱いにくくなります。 それで、取引は何ですか?主題に関する決定的な本が、このようにそれをするように言っているのはなぜですか? 関数呼び出しのオーバーヘッドは本当にそれほどですか?これはうまく機能するものですか、文法が事前にわからない場合に必要ですか(正規表現)?または、より具体的なソリューションがより具体的な文法でうまく機能する場合でも、すべてのケースを処理する何かでしょうか? (注:可能性のある重複「なぜ巨大なswitchステートメントの代わりにオブジェクト指向アプローチを使用するのか?」は近いですが、オブジェクト指向については気にしません。機能的アプローチ、またはスタンドアロン関数での賢明な命令型アプローチでも問題ありません。) また、例のために、識別子のみを持つ言語を考えてみましょう[a-zA-Z]+。これらの識別子はです。DFA実装では、次のようなものが得られます。 private enum State { Error = -1, Start = 0, IdentifierInProgress = 1, IdentifierDone = 2 } private static State[][] transition = new State[][]{ ///* Start */ new State[]{ State.Error, State.Error (repeat until 'A'), State.IdentifierInProgress, ... ///* IdentifierInProgress */ new State[]{ State.IdentifierDone, …

3
アイテムの配送用の3Dパッキングアルゴリズム
可能な限り少ない箱に商品を収納するための最良の方法を提案する配送見積もりを作成するタスクを受け取りました。 既知の長方形のボックスサイズには有限のセットがあります 箱の中に詰められる多くの任意の長方形のアイテムがあります 少ないボックスが最適に使用されるべきです。2つの箱1x1x1を出荷するのは、1つの箱1x2x1よりもはるかに高価だからです。ここが優先事項です。 また、第2レベルの優先度として、できるだけ小さなボックスを使用するように最適化する必要があります。(例:1つの大きな箱と2つの小さな箱から選択できる場合、大きな箱を選択する必要があります) アイテムはボックスに収まるように回転できますが、回転は少なくとも45°の増分に制限する必要があります(私の研究では、一部の構成では、より大きな四角形のボックス内に四角形のボックスをより適切に収めることができるようです) 、90°回転であることが標準です。 ボックスには重量制限があり、アイテムには任意の重量があります(例:サイズが1x1x1のアイテムは、他の2x2x2アイテムよりも重いことがあります) 私は少し調べて、ビンのパッキングとナップザックの問題に関するいくつかの抽象化アルゴリズムを見つけましたが、次のやや強引なバリエーションがあり、最適なアルゴリズムに似ています。 「梱包するアイテム」リストで、アイテムを減少したボリューム順(大きい方)に並べ替えます このリストの各アイテムについて: 「使用済みボックス」リストにある小さなアイテムを選択し、アイテムに合うのに十分な残りの容量と重量の制限があります(寸法と重量を合わせるためにここでフィットを使用します) そのようなボックスがない場合、可能なボックスサイズの既知のセットから新しいアイテムを作成します。これは、アイテムの寸法と重量に適合する最小サイズで、「使用済みボックス」のリストに追加します。 ボックスがアイテムにフィットする場合(以下のフィット関数を使用)、「このボックスのアイテム」のリストに追加し、「フィットするアイテム」リストから削除して、ボックス内の相対的な3D位置をマークします。 「梱包するアイテム」リストに適合するアイテムがなくなるまで、2.1から繰り返します。 上記の手順2で使用されるフィッティングチェック関数: ボックスの残りのボリュームがアイテムのボリュームに収まるかどうかを確認します。そうでない場合は、falseを返します。 「箱のアイテム」の重量と現在のアイテムの重量の合計が箱の重量制限以下かどうかを確認します。そうでない場合は、falseを返します。 「ボックスのアイテム」リストをチェックして、Yコンポーネントが最小で、アイテムの幅、奥行き、高さに十分なスペースがある最初のボックス座標を選択します。 アイテムが現在の向きに収まらない場合は、単純化のために45°の回転を想定せずに、6つの可能な回転のいずれかで回転します。(すでにテストされているサイズをスキップできる回転。例えば、ボックスを180°回転させると、すべてのボックスとアイテムが反対面で同じサイズになるためスキップできるため、元の位置と同じ寸法になります。) アイテムがすべての可能な方法で元の方向に戻されていない場合は、手順3からやり直してください。 すべての回転が試行され、フィットが見つからなかった場合、現在の座標を利用できないスペースと見なします。 使用可能なスペースがない場合は、falseを返します。そうでない場合は、ステップ3から再試行してください。 提示された制約が与えられた場合、私の問題に対する最善の解決策があるかどうかを知りたいです。 これは理論上はうまくいくようですが、コードでは試していません。私は正しい方向に進んでいるか、これを行うより良い、パフォーマンスの良い方法があるかどうかを知りたいです。 参照は素晴らしいでしょう。 編集: 必要なことを行う興味深いサードパーティAPIをいくつか見つけましたが、これは切断する必要があるため、これらにアクセスすることはできません。 以下に例を示します。 http://v2.3dbinpacking.com/demo/main http://www.packit4me.com/api 編集2: 解決すべき問題の実例は次のとおりです。 私は4つのボックスサイズWxHxDを持っています:10x12x18、12x16x24、16x20x30、24x32x40 私はサイズが6x8x10、2x 22x14x30、1x 22x4x20の4つのアイテムを注文しています このアイテムを可能な限り少ないボックスを使用して、可能な限り小さいボックスを使用し、可能な限り少ない空きスペースを残して、1つ以上のサイズの任意の量のボックスに収めるにはどうすればよいですか?

9
真の「日付のみ」のデータ型がないのはなぜですか?
本当に「たった1日」のデータセットにDateTime値を使用しなければならないことに、とてつもなくイライラしています。誕生日は最も一般的な例ですが、これは常にビジネスアプリケーションで発生します。 「日付のみ」のレコードの「時刻」部分を「正午」に設定することに慣れてきました(タイムゾーンに関係なく日付が変更されることを回避します)。これはハックのように思え、私はこの問題を巡るジュニア開発者からのバグを永遠に見つけています。 時間は常に固定小数点に対して相対的です。午後4時は、子午線または正午の4時間後です。移動中の太陽の最高点は観測可能であり、座標系を設定できます。正午の3時間前(前子午線)、正午の2時間後、1970年1月1日から1441899402938ミリ秒。デカルト世界で育った人々にとって、これは2番目の性質です。 ただし、カレンダーはデカルトより前のものです。私の主張は、モジュロ関数が適用される列挙としてより適切に考えられているということです。月曜日が日曜日に続き、日曜日が土曜日に続くという事実がわかるまで続きます。正負はありません。モジュラスまたは絶対値です。 同様に年が繰り返されます。誕生日、記念日、子供の誕生日など、365日ごと(またはそれ以降)に特別な日がいくつかあります。ビジネススケジューリングアプリケーションには、7日ごと、月の最初の火曜日などの会議の例がたくさんあります。これを浮動小数点数にマッピングすることができます。実際には、これを上記の数にマッピングすることで、従来の方法では非常に困難だった多くの問題を解決できますが、それが唯一の方法ではありません。 DateTimesを使用してDatesを保存するという「丸い穴の四角い釘」の性質に対する認識と理解は、私の意見では優れたプログラマーになります。 Dateクラスを定義する際にスケジューリングアプリケーションとして明示的に意図されたアプリケーションに価値はありますか、それとも「正午にすべての時間を設定する」ことが最善のアプローチですか。DateTimeを使用し、Timeコンポーネントを正午に設定すると、どのような問題が発生する可能性がありますか?そのようなアプローチでタイムゾーンのシフトを考慮することができますか?私はMomentJSを使用しましたが、それはちょうど良いDateクラスだと思います。

3
「4の値を変更したことはありますか?」-これがどのようにHayes-Thomasクイズに入ったのですか?
1989年、リー・フェリックス、ジョン・ヘイズ、アンジェラ・トーマスは、多くのインサイダージョークを含むクイズ形式のハッカーのテストを書いた。」 次のシリーズを検討しています。 0015 Ever change the value of 4? 0016 ... Unintentionally? 0017 ... In a language other than Fortran? シリーズの中で「4」という数字を具体的にする特別な逸話はありますか? 一部のFortran実装では、定数の値を変更できましたか?これは、当時一般的に使用されていた他の言語でも可能でしたか?
24 history  fortran 

1
単一のpythonファイル配布:モジュールまたはパッケージ?
useful_thing単一のファイルに存在する便利なpython関数またはクラス(または何でも)が呼び出されたとします。ソースツリーを整理するには、本質的に2つの方法があります。最初の方法は単一のモジュールを使用します: - setup.py - README.rst - ...etc... - foo.py どこuseful_thingで定義されていますfoo.py。2番目の戦略は、パッケージを作成することです。 - setup.py - README.rst - ...etc... - foo |-module.py |-__init__.py どこuseful_thingで定義されていますmodule.py。パッケージの場合__init__.pyは次のようになります from foo.module import useful_thing 両方の場合でできるようにfrom foo import useful_thing。 質問:どちらの方法が推奨されますか? 編集:ユーザーgnatはこの質問の形式が不十分だと言っているので、公式のpythonパッケージチュートリアルでは、上記のどの方法が推奨されるかについてコメントしていないようです。私は、賛否両論の議論を生成するのではなく、コミュニティが好む方法があるかどうかに興味があるので、私は賛否両論の個人的なリストを明示的に与えていません

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