ソフトウェア工学

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

2
Phaserなどのステートフルフレームワークのユニットテスト
TL; DRステートフルなフレームワーク内で作業する場合、自動化された単体テストを簡略化するための手法を特定するのに役立ちます。 バックグラウンド: TypeScriptとPhaserフレームワークでゲームを書いています。Phaserは、コードの構造をできるだけ制限しないHTML5ゲームフレームワークとしての地位を占めています。これにはいくつかのトレードオフが伴います。つまり、キャッシュ、物理、ゲームの状態など、すべてにアクセスできるGod-object Phaser.Gameが存在します。 このステートフル性は、私のタイルマップなどの多くの機能をテストすることを本当に困難にします。例を見てみましょう: ここでは、タイルレイヤーを正しくテストして、タイルマップ内の壁と生き物を識別できるかどうかをテストしています。 export class TilemapTest extends tsUnit.TestClass { constructor() { super(); this.map = this.mapLoader.load("maze", this.manifest, this.mazeMapDefinition); this.parameterizeUnitTest(this.isWall, [ [{ x: 0, y: 0 }, true], [{ x: 1, y: 1 }, false], [{ x: 1, y: 0 }, true], [{ x: 0, y: 1 }, …

1
`(seed * 9301 + 49297)%233280`ランダムアルゴリズムの元のソース?
シードされた(疑似)乱数ジェネレーターの作成例を検索すると、次のようなものに出くわします(特定の例http://indiegamr.com/generate-repeatable-random-numbers-in-js/): // the initial seed Math.seed = 6; // in order to work 'Math.seed' must NOT be undefined, // so in any case, you HAVE to provide a Math.seed Math.seededRandom = function(max, min) { max = max || 1; min = min || 0; Math.seed = (Math.seed * 9301 + …
9 history  random 

4
DALレイヤーとBLLレイヤー間でのデータとビジネスオブジェクトの取得の分離
この質問を投稿する前に、いくつか調査を行いました。他の質問や投稿の中で、そのうちの1つを以下に示します。どのように判断するか明確な心がつかめなかった。 データアクセス層内のビジネスオブジェクト リポジトリがあり、ビジネスレイヤーはリポジトリを呼び出してデータを取得します。たとえば、BLLとDALの次のクラスがあるとします。 class BllCustomer { public int CustomerId {get; set;} public String Name {get; set;} public BllAddress Address {get; set;} } class BllAddress { public int AddressId {get; set;} public String Street {get; set;} public String City {get; set;} public String ZipCode {get; set; } } class DalCustomer { …

1
各実装がUIの一部をカスタマイズできるようにするアプリケーションフレームワークの設計
私は、各実装がユーザーインターフェイスの一部をカスタマイズできるようにするアプリケーションフレームワークの設計を任されています。そのような例の1つは、実装(これをクライアントと呼びましょう)が、特定の画面に返すコレクションビューセルを定義できることです。フレームワークは、適切なオブジェクトを販売してアプリを簡単に構築できるようにするだけです。これは、いくつかの類似したインスタンスを構築するためです。 フレームワークへの私の現在のアプローチは、アプリ全体のすべてのプレゼンテーションおよび却下イベントを担当する調整コントローラーを設計することでした。デフォルトのCoordination Controllerは、フレームワーク内のすべてのデフォルトのビューコントローラーを提供します。デフォルトのビューコントローラーは、構成されたUIを提供することなく、関連するタスクをすべて実行します。たとえば、1つのコントローラーがテンプレートセルを含むコレクションビューを表示し、特別なものは何もありません。この設計の利点は、コントローラー間の結合がなくなり、クライアントがデフォルトのコーディネーターをオーバーライドして、特定のタスクに対してまったく新しいビューコントローラーを返すことができることです。 私が抱えている問題は、このフレームワークを設計して、クライアントが独自のカスタムUIをアプリに追加できるようにする方法です。 アプローチ1 フレームワークにビューファクトリを必要とし、このビューファクトリがすべての関連するビューの販売を担当するようにします。したがって、アプリデリゲートでは、クライアントがたとえばCollectionViewCellFactoryを作成し、インターフェイスが、準拠するクラスが提供する必要のあるすべてのセルを定義するように強制できます。私はこのデザインのコードベースを継承しましたが、コードベースが抽象化されすぎてカスタマイズできなかったので、コードベースから離れました。これには、アプリのあらゆる側面に対応する多数のファクトリーが付属しており、これにより、すべてのアプリのセットアップ時間に数日が追加されました。 アプローチ2 各ビューコントローラーは、これらのカスタムUIクラスを実行時に定義できるようにするサブクラス化フックまたはセットアップAPIを指定します(UISplitViewControllerが呼び出し側がviewControllersプロパティを使用してコントローラーをセットアップする方法と同様です)。これを行うには、各クライアントは基本の調整コントローラーと各コントローラープレゼンテーションでサブクラス化するだけです。コントローラに適切な値を設定して、目的のUIを実現します。何かのようなもの viewController.registerReusableCellsBlock = ^(UICollectionView *collectionView){ //perform custom registration } viewController.cellDequeueBlock = ^UICollectionViewCell<SomeProtocol> *(UICollectionView *collectionView,NSIndexPath *indexPath){ //dequeue custom cells } 現在、私は再利用性を促進し、ViewControllerの肥大化を防ぐために、ビューのデータソースを別のオブジェクトに分離しています。これにより、セルのインターフェイスを提供するビューコントローラーのサブクラス化が少し難しくなりますが、不可能ではありません。 アプローチ3 おそらく、フレームワークを設計してその使用法を予測しようとするのは悪い考えです。おそらく、最良のオプションは、セットアップコストが比較的高い場合でも、最大限の制御でサブクラス化できるようにすることです。次に、いくつかのクライアント用に構築したら、出現するパターンに気づき、ルートに沿って最適化を開始します。 私はフレームワークの内部でカスタマイズ可能にする方法を理解しています。私が苦労しているのは、クライアントによるフレームワークの潜在的なカスタマイズポイントを定義するインターフェースを最適に定義する方法です。 TL; DR インターフェイスの最も複雑な部分は、コレクションビューセル内にネストされたコレクションビューを扱います。これにより、セルの水平ページングと垂直スクロールが可能になります。これは、水平セルを管理し、各セルのコレクションビューを新しいデータソースで構成する1つのデータソースを持つことで実現されます。 これらすべてのセルをカスタマイズ可能にするインターフェイスをどのように設計しますか?

4
GPLv2ライセンスソフトウェアを使用してデータを取得する場合、ソースコードをオープンにする必要がありますか
私は自分でカレンダープロジェクトに取り組んでいます。このプロジェクトでは、スイスのエフェメリスを使用します。GPLv2と商用でライセンスされています。ライセンスの商用バージョンでは、開発者は自分の希望どおりにソフトウェアを配布する権利があります。しかし、これは私の個人的なプロジェクトなので、GPLv2ライセンスを使用する必要があります。 ライブラリとデータファイルを使用して、カレンダーのデータを生成しています。今後、これらのカレンダーを自由にウェブサイトで公開していきます。このプロセスでは、明らかにライブラリを変更し、独自のコードやその他の雑用を記述しなければなりません。最終的なソースコードを公開する必要がありますか? 公開しても問題ありません。しかし、もしそうなら、私は尋ねています。 編集:@apsillersなどの詳細な回答から、ソフトウェアをGPLにしたり、Webサイトの訪問者にソースコードを提供したりする必要がないことは明らかです。表示されているデータをGPLにする必要がありますが、GPLv2以降でライセンスされた商用のスイスエフェメリスデータとして: より一般的には、プログラムが入力を他の形式に変換するとき、出力の著作権ステータスは、それが生成された入力の著作権ステータスを継承します。

3
アプリケーションをゼロから設計する際に、ジュニア開発者をどのように関与させるのが最善ですか?[閉まっている]
休業。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善してみませんか?この投稿を編集して、事実と引用で回答できるように質問を更新してください。 5年前休業。 私たちは3人の開発者(2人の経験豊富な開発者と1人のジュニア)のチームです。 私たちは真新しいプロジェクトを始めました。アプリケーションを設計し、適切なアーキテクチャを選択することに集中して取り組み、コードの最初の行を配置します。その中核、つまりアプリケーション全体の基礎となるものを書いています。 これも簡単なアプリケーションではありません。厳しいパフォーマンス要件、大規模に分散された複雑なエンティティモデルなど。 私たちは皆、特にジュニアの快適ゾーンの外にいます。彼は優れたデザインを事前に作成する経験がありません。私と他の開発者が助けを求めており、私たちは両方ともメンタリングとチームの構築を信じているため、それは問題ではありません。楽しい経験とスキルの最大量を学びます。 新しいプロジェクトには後輩がいないことに気づき、既存のプロジェクトでは後輩が学習し、刺激するための完全なコードベースを持っていたので、後輩にとっては簡単でした。しかし、このアプリにはほとんどコードがありません。始めたばかりです。 私たちはいくつかのアプローチを考えていました: 彼に数日間自分で試してもらい、コードに介入して一緒にリファクタリングし、正しい方向に彼を導き、次に繰り返す=>すべてのリファクタリングで彼の間違いを指摘するので、彼にとって楽しい経験ではないかもしれない; 彼に私たちの1人とプログラミングをペアリングさせる=>彼は単なる「傍観者」になり、実際に多くの情報を学習したり、多くの情報を要約したりせずに、私たちのすべてに同意するかもしれません。 各モジュールのスケルトンを構築し、しっかりとした設計で、不足している部分を追加するようにモジュールを彼に与えます=>私たちの後にピックアップするのは面白くないかもしれません。デザイン全体ではありません。 彼をどうにかして設計に関与させて、彼がどういうわけかそれの外に残されたと感じないようにし、彼が経験から多くを学び、自分で試してみるのに十分な自信を得ることはできますか?

3
リーグスケジューリングアルゴリズムの特定に支援が必要
私はスポーツリーグのスケジューラを作成しようとしています。各スロットを効率的に埋めるのに役立つアルゴリズムを特定できません。 スケジュールを作成するためのサンプルデータは次のとおりです。 10チーム 各チームはお互いに1回プレイします(合計45試合必要) 各チームは1日に1回しかプレイしません テストでは、1日あたり5スロットで9日間使用しています。 コンボテーブル(45のコンボを含む) ID Team1ID Team2ID ビット割り当て 済み スケジュールテーブル(45のタイムスロットを含む) scheduleID homeTeamID awayTeamID GameDate GameTime 現在、私の既存の手順は、スロットの約90%を占め、上記のルールに基づいて、スケジュールの競合のためにスロットの10%を空にします。 スケジュールテーブルを日付/時間の昇順でループします。 私の最初の時間帯は土曜日の午前8時です。 まだスケジュールされていないチームのリストを照会します。次に、それらのチームの可能な組み合わせの配列を作成します。次に、その配列を使用して、まだスケジュールされていない組み合わせから組み合わせテーブルから1つのランダムなレコードを取り出し、それらのチームをスケジュールに配置します。次に、その組み合わせを使用するように設定します。 ループを何度も繰り返し、使用可能なチームのリストが小さくなるたびに、結果として配列も小さくなります。 いくつかの日はうまく行き、他の日に私の最後の最後の2つの残りのチームは前の週にすでにプレーしたので、それらは再びスケジュールに追加されません。 まだ試していないのは、競合する日を「リセット」して、もう一度試し、より良い配置が得られるかどうかを確認することだけです。 誰か提案はありますか?

3
画像モザイクを作成するためのアルゴリズム-これよりも速い方法はありますか?
私は画像モザイクの作成に取り組んできました。私のスクリプトは多数の画像を取得し、それらをサムネイルサイズに縮小してから、それらをタイルとして使用してターゲット画像を概算します。 アプローチは実際にはかなり楽しいです: すべてのタイル位置のすべての親指の平均二乗誤差を計算します。 最初は貪欲な配置を使用しました。エラーが最小の親指をタイルに最も適したタイルに配置し、次に親指を配置します。 貪欲の問題は、あまり一致しないかどうかにかかわらず、最も人気のないタイルに最も異なる親指を配置することになるということです。ここに例を示します:http : //williamedwardscoder.tumblr.com/post/84505278488/making-image-mosaics そのため、スクリプトが中断されるまでランダムスワップを実行します。結果はまったく問題ありません。 2つのタイルのランダムスワップは必ずしも改善されるとは限りませんが、3つ以上のタイルのローテーションによって全体的な改善がもたらされるA <-> B場合がA -> B -> C -> A1あります。 このため、ランダムなタイルを2つ選んで改善されないことがわかった後、タイルの束を選び、そのような回転で3番目のタイルになるかどうかを評価します。4つのタイルの任意のセットを有利に回転できるかどうかなどは検討しません。それはまもなく超高額になるでしょう。 しかし、これには時間がかかります。 より良い、より速いアプローチはありますか? バウンティ更新 ハンガリー語メソッドのさまざまなPython実装とバインディングをテストしました。 はるかに高速だったのは、純粋なPython https://github.com/xtof-durr/makeSimple/blob/master/Munkres/kuhnMunkres.py 私の直感は、これが最適な答えに近いということです。テストイメージで実行すると、他のすべてのライブラリが結果に同意しましたが、このkuhnMunkres.pyは桁違いに高速でしたが、他の実装が同意したスコアに非常に非常に近づいています。 速度はデータに大きく依存します。モナリザは13分でkuhnMunkres.pyを駆け抜けましたが、スカーレットチェステッドインコは16分かかりました。 結果は、インコのランダムスワップとローテーションとほとんど同じでした。 (左側はkuhnMunkres.py、右側はランダムにスワップ、比較のための元の画像) しかし、私がテストしたモナリザの画像で​​は、結果が著しく改善され、彼女は実際に彼女の定義された「笑顔」を輝かせていました: (左側がkuhnMunkres.py、右側がランダムスワップ)

2
Golang / Haskellの型推論
Goには、MLやHaskellなどの関数型言語が持っているという意味で、実際には型の推論がないという事実を読んだことがありますが、2つのバージョンの比較を理解するのは簡単ではありません。Goの型推論がHaskellの型推論とどのように異なるか、およびそれぞれの長所と短所を基本的な用語で誰かが説明できますか?

4
クラスのメソッドは、それ自体を変更した後、いつ同じインスタンスを返す必要がありますか?
私は3つのメソッドを持つクラスを持っているA()、B()とC()。これらのメソッドは、独自のインスタンスを変更します。 インスタンスが別のコピーである場合(同様に)、メソッドはインスタンスClone()を返すvoid必要がありreturn this;ますが、メソッドで同じインスタンスを変更し、他の値を返さない場合は、同じインスタンス()を返すか、自由に選択できます。 同じ変更されたインスタンスを返すことを決定するとき、のようなきちんとしたメソッドチェーンを実行できますobj.A().B().C();。 これがそうする唯一の理由でしょうか? 自分のインスタンスを変更して返すこともできますか?それとも、コピーのみを返し、元のオブジェクトを以前のままにしておくべきですか?同じ変更されたインスタンスを返す場合、ユーザーは戻り値がコピーであると想定する可能性があるため、それ以外の場合は返されませんか?それが問題なければ、メソッドでそのようなことを明確にする最良の方法は何ですか?

4
DDD(またはセンス)との関係をモデル化しますか?
簡略化された要件は次のとおりです。 ユーザーがQuestion複数Answerのでを作成します。Question少なくとも1つ必要Answerです。 明確化:考えるQuestionとAnswer同様の試験:1つの質問がありますが、いくつかの答えは、どこ少数の正しいかもしれません。ユーザーはこのテストを準備している俳優なので、質問と回答を作成します。 この単純な例をモデル化して、1)実際のモデルと一致させ、2)コードで表現力を高め、誤用やエラーの可能性を最小限に抑え、開発者にモデルの使用方法のヒントを与えるようにしています。 質問はエンティティですが、回答は値オブジェクトです。質問は答えを保持します。これまでのところ、私はこれらの可能な解決策を持っています。 【A】工場内Question Answer手動で作成する代わりに、以下を呼び出すことができます。 Answer answer = question.createAnswer() answer.setText(""); ... これで回答が作成され、質問に追加されます。次に、プロパティを設定して回答を操作できます。このようにして、質問のみが回答を作成できます。また、迷わず回答させていただくこともございます。ただし、回答はでハードコーディングされているため、回答の作成を制御することはできませんQuestion。 上記のコードの「言語」には1つの問題もあります。ユーザーは質問ではなく回答を作成する人です。個人的には、値オブジェクトを作成するのが好きではありません。開発者に依存して値を入力します-どのように追加する必要があるかをどのように確認できますか? [B]質問の中のファクトリー、#2を取る この種のメソッドはQuestion次のようにすべきだと言う人もいます: question.addAnswer(String answer, boolean correct, int level....); 上記のソリューションと同様に、このメソッドは回答の必須データを取得し、質問にも追加されるデータを作成します。 ここでの問題は、正当な理由なくのコンストラクタを複製するAnswerことです。また、質問は本当に答えを作成しますか? [C]コンストラクターの依存関係 両方のオブジェクトを自分で自由に作成してみましょう。依存関係の権利をコンストラクタで表現しましょう: Question q = new Question(...); Answer a = new Answer(q, ...); // answer can't exist without a question 質問がないと回答を作成できないため、これは開発者にヒントを与えます。ただし、質問に回答が「追加」されるという「言語」は見当たりません。一方、本当に見る必要がありますか? [D]コンストラクターの依存関係、2番を取る 反対のことができます: Answer a1 …

1
メニュー構築パターン
メニューがルーティングに使用されていない場合、メニューのアクティブ状態の処理に頭を悩ませています。 メニューシステムがルーティングも処理するDrupalから来ました。したがって、アクティブ状態とアクティブトレイル状態の設定は、ルートによって処理されます(これはメニューレンダリングシステムとしても機能します)。 現在、多くのPHPフレームワークには、ルーティングを処理するルータークラスがあります。メニューはPOSTを認識してはならないため、これは良い分離のようです|| オプション|| ... リクエスト。 しかし、フロントエンドを書いているとき、メニューをハードコーディングしていることに気づきました。または、すべてをDBに保存し、それらの値をビューに渡します。このアプローチが嫌いなのは、ルーターで既に書き込んだもののコピーを作成しているが、現在はMenuクラスを使用していることです。 例: Route::get('/somewhere','routename.somewhere','showStuffController'); Route::post('/somewhere','routename.somewhere','saveStuffController'); Menu::add('label.somewhere','routename.somewhere'); ここで懸念を分離しているので、それは素晴らしいことです。しかし、MenuはRouteに大きく依存して、アクティブ状態を設定します。メニューは、アクティブトレイルを設定するための階層についても知る必要があります。 つまり、アクティブなトレイルとアクティブなステータスクラスを設定することは、実際にはビューのことです。しかし、 if ( Route::currentName() === $menuitem->getRouteName() ) { print 'active'; } あなたの意見の至る所で愚かに思えます。次に、迷惑なアクティブトレイルをすべて追加します。ビューがレンダリングされる前にそれを処理し、active-trailフラグをtrueに設定することは、私が知っている方法では非常に醜いようです(すべての子をループするforeachループ、...) 私の質問は: このよりきれいな、より良い、...を得るパターンまたはスマートな方法はありますか?アクティブトレイルの「問題」をどのように処理する必要がありますか? 子->親のレンダリングを考えていました。したがって、最も深いレベルの広告から始めて、次の段階に進みます。しかし、子供はその親について知っていますが、親は自分の子供については何も知りません(変なようです)。

1
ユニットとインテグレーションのギャップのテスト:小型コンポーネントインテグレーションのユニットインテグレーションテスト
過去数週間、私はテスト方法論のギャップを埋める方法を検討し、検討してきました。簡単に言うと、単体テストは小さすぎ、従来の統合テストは大きすぎます。 頻繁にシナリオがアップになるAとB、両方の使用コンポーネントをC。ただしA、のB要件は少し異なり、についての仮定も少し異なりますC。私が開発者である場合A、どこでどのように私の想定をテストするのCですか? 明らかにAモックされた仮定Cを使用Aした単体テストは、単独でのテストには適していますが、仮定自体はテストしません。 別の可能性は、の単体テストを追加することですC。ただし、これはA開発段階ではありますがC、仮定を進化させてテストを変更するのは非常にA不格好なため、これは理想的ではありません。実際、A開発者はC(たとえば、外部ライブラリ)の単体テストに適切にアクセスできない場合もあります。 これをより具体的な例でフレーム化するには:これがノードアプリケーションであると想定します。 AにB依存しC、(特に)ファイルを読み取り、ファイルの内容をに渡されたオブジェクトに格納しますC。最初Cは、処理するすべてのファイルが小さく、重大なブロックなしで同期的に読み取ることができます。ただし、の開発者Bは、自分のファイルが巨大になりC、非同期読み取りに切り替える必要があることを認識しています。これにより、で散発的な同期バグが発生します。Aこれは、Cファイルを同期的に読み取ることを前提としています。 これは、完全な統合テストから追跡するのが非常に難しいことで有名なタイプのバグであり、統合テストではまったく検出されない可能性があります。またA、Asの前提条件がモックされているため、sの単体テストでは捕捉されません。ただし、「」Aおよび「」のみを実行する「ミニ」統合テストで簡単に検出できますC。 このタイプのテストへの参照はわずかしか見つかりませんでした。小型の統合、コンポーネント統合テスト、ユニット統合テスト。また、正式なTDD単体テストではなく、BDDテストの方向性にも関係しています。 このテストギャップをどのように埋めますか?具体的には、そのようなテストはどこに置くのですか?どのように私はの入力あざけりないAとC「ミニ」統合テストのために?そして、これらのテストと単体テストの間でテストの懸念を分離するためにどれだけの努力を払う必要がありますか?または、テストのギャップを埋めるためのより良い方法はありますか?

3
名前付き関数を定義するための重複した構文は、言語設計の悪い決定ですか?
私は楽しみのためにプログラミング言語をモデリングしており、構文はScala、特に関数定義に大きく影響されています。 私の言語は、def構文(クラスメソッド)によって定義された関数と値に割り当てられた匿名関数(を使用して作成された)を区別しないため、設計上の問題が発生しました=>- 実装と動作の両方の違いが取り除かれます。 その結果、次の2つの定義は同じ意味になります。 def square(x: Int) = x*x val square = (x: Int) => x*x 後者の形式(即時の無名関数の割り当て)が通常の状況で使用される理由はありません- フォームの代わりにそれを使用することは単に可能defです。 名前付き関数を定義するためにそのような重複した構文を使用すると、言語の直交性やその他の設計上の側面が損なわれますか? メソッドと名前付き関数の短くて直感的な定義(を介してdef)と匿名関数の短い定義(を使用=>)が可能になるため、このソリューションを選択します。 編集:Scala は 2つを区別します。無名関数はdef、Scalaで定義されたメソッドと同じではありません。違いは比較的微妙ですが、以前にリンクした投稿を参照してください。

4
Cで「デストラクタ」を省略すると、YAGNIが過度に影響を受けますか?
私はOOのようなテクニックを使用して、Cで中程度の組み込みアプリケーションに取り組んでいます。私の「クラス」は.h / .cモジュールであり、データ構造体と関数ポインタ構造体を使用して、カプセル化、ポリモーフィズム、および依存性注入をエミュレートします。 これで、myModule_create(void)関数にmyModule_destroy(pointer)対応する関数が付属することが期待されます。しかし、プロジェクトが埋め込まれている場合、現実的にインスタンス化されたリソースは決して解放されるべきではありません。 つまり、4つのUARTシリアルポートがあり、必要なピンと設定を使用して4つのUARTインスタンスを作成する場合、ランタイム中のある時点でUART#2を破棄する必要はまったくありません。 YAGNI(あなたはそれを必要としないでしょう)の原則に従って、私はデストラクタを省略すべきですか?これは私には非常に奇妙に思えますが、それらの使用法を考えることはできません。デバイスの電源がオフになると、リソースは解放されます。

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