ソフトウェア工学

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

3
「プラス」と「マイナス」は適切なメソッド名ですか?
Java SE 8には、時刻、インスタントLocalDate、LocalTimeおよびLocalDateTimeクラスを紹介するクラスを導入するための新しいメカニズムが付属しています。そのようなインスタントを操作するために、一連のメソッドが提供されます:LocalDate.plusDays(...)などLocalDate.minusDays(...)。 メソッドは、実際には実行される操作であり、アクションを実行するものであるため、良いプラクティスは、メソッドの目的を説明する動詞にちなんでメソッドに名前を付けることだと常に考えてきました。あなたのようなクラスを検討している場合だけに言及し、StringBuilder例えば、メソッドの名前はappend、insert、delete... これが、私にとって、の代わりにメソッドplusDaysを命名するように聞こえない理由です。非常に迷惑なのは私だけですか?どう思いますか?sumDaysminusDayssubtractDays 私が考えることができる唯一の理由は、日付が不変オブジェクトであるためplusDays、元のオブジェクトに日を追加するのではなく、新しいプロパティで新しい日を作成することですが、それは非常に微妙です。

4
ドメインクラスとSQLクエリ間のロジックの重複を回避する方法は何ですか?
以下の例は完全に人為的であり、その唯一の目的は私のポイントを理解することです。 SQLテーブルがあるとします: CREATE TABLE rectangles ( width int, height int ); ドメインクラス: public class Rectangle { private int width; private int height; /* My business logic */ public int area() { return width * height; } } ここで、データベース内のすべての長方形の合計面積をユーザーに表示する必要があると仮定します。テーブルのすべての行をフェッチし、それらをオブジェクトに変換して、それらを反復処理することで、それを実現できます。しかし、これはばかげているように見えます。なぜなら、テーブルにはたくさんの長方形があるからです。 だから私はこれをします: SELECT sum(r.width * r.height) FROM rectangles r これは簡単で高速で、データベースの長所を利用します。ただし、ドメインクラスでも同じ計算を行うため、重複したロジックが導入されます。 もちろん、この例では、ロジックの複製は致命的ではありません。ただし、他のドメインクラスでも同じ問題に直面します。これはより複雑です。

5
最大でターゲットへの弾丸のパスを計算するためのアルゴリズム。2リコット
悪いタイトルで申し訳ありませんが、私はそれを表現するより良い方法を持っていませんでした... Wiiには任天堂による素晴らしいゲームがあります(そうです!)。9つのミニゲームがあり、私のお気に入りはタンクと呼ばれます!。自分自身を破壊することなく、COM敵の戦車を破壊することです。レベルのスクリーンショットは次のとおりです。 戦車を破壊する1つの方法は、弾丸を発射することです。このライムグリーンの敵の戦車は、2回跳ね返る(壁やブロックに対して)高速弾丸を発射します。プレイヤーの戦車が現在の場所に留まっていると、プレイヤーの戦車が即座に破壊される様子を見ることができます。中央の石灰戦車は、画像に描いた緑の道に沿って弾丸を発射できます。 私はアマチュアプログラマーとして、ライムタンクがプレイヤータンクを撃つためにどの方向に発火すべきかをどのように決定できるのかと思っていました。 私は自分でそれについて考えましたが、可能なアルゴリズムを思いつきませんでした。誰かに刺激を与えた場合の結論を説明します。説明を簡単にするために、壁は弾丸が跳ね返ることのできる表面であると想定しています。したがって、ブロックの孤立した長方形が4つの壁を形成します。 私は、弾丸のリコットが常に平行四辺形の片側にあるか、平行四辺形の反対の頂点になる2つの点を結論付けました。射撃する敵の戦車と、それが狙うプレイヤーの戦車は、必ずしも他の2つの頂点ではありませんが、平行四辺形の4つの側面のいずれかと同一線上にあることは間違いありません。以下は、平行四辺形を形成できる4つの可能な方法の説明です。 HOR-VERは、弾丸が最初に水平の壁に当たり、次に垂直の壁に当たります。 そして、私は立ち往生しています。敵の戦車とプレイヤーの戦車をマップ上で接続するラインを移動して、壁との2回のヒットで平行四辺形を形成するかどうかを考えましたが、敵の戦車とプレイヤーの戦車は平行四辺形の頂点と必然的に一致します。 また、アルゴリズムの一般的な流れがわかりません。アルゴリズムは次の2つの構造のいずれかを使用しますか、それとも両方とも間違っていますか? 考えられるパスを常に把握し、常に1つを最良としてマークし(最短、最も不明瞭、最も避けられない、または複数の基準に基づいた組み合わせおよび重み付けの評価)、残りは忘れます。すべての計算後に残ったものが最適です。 最初に弾丸で到達可能なすべての壁を決定し(これらの各壁に到達するために弾丸が他の壁に跳ね返る必要はありません)、次にこれらの各壁のすべての到達可能な範囲を決定します(遠くの点に到達できない場合があります)別の壁があなたの近くに立っている場合は跳ね返りのない壁)、再び跳ね返りで到達可能なすべての壁、およびこれらの壁に到達可能なすべての範囲を決定します。これらの4つのプロセスは、レイトレーシングと同様の方法で実行できます。各プロセス中に、プレイヤーの戦車が光線に当たった場合、その光線に従って弾丸の経路を見つけます。 私の意見では、このアルゴリズムは次の理由で把握するのが困難です。 弾丸はどの方向にも発射できます。そして 数学のように、線上に無限に多くの点がある壁には、無限に多くの点があります。 しかし、任天堂の人々はとにかくそれを作ったので、...アイデアを持っている人はいますか?

2
なぜCはポインターにアスタリスクを使用するのですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 4年前に閉鎖されました。 私は今Cについて学んでいます。 作成者*が実際にポインターのように見えるシンボル()ではなく、ポインターのシンボルとしてアスタリスク()を選択したのは奇妙に思えます->。 逆参照と関数ポインターの混乱を考慮すると、アスタリスクを使用する歴史的、または実用的な理由がありますか?
21 c  history  syntax 

4
関数型プログラミングは、依存性注入パターンの実行可能な代替手段ですか?
私は最近、C#での関数型プログラミングというタイトルの本を読んでいます。関数型プログラミングの不変でステートレスな性質は、依存性注入パターンと同様の結果を達成し、特にユニットテストに関してはより良いアプローチである可能性があります。 両方のアプローチの経験がある人なら誰でも、主な質問に答えるために自分の考えや経験を共有できれば感謝しています。

9
統合テストをどのようにスケーリングしますか?
現在の製品で増加している統合テストの規模を拡大するための技術と戦略を調査しており、開発およびCIプロセスの一部として(人間的に)残ることができます。 約200以上の統合テストで、(デスクトップ開発マシン上で)完全なテスト実行を完了するために1時間のマークをすでに打っています。これは、定期的なプッシュプロセスの一部としてスイート全体を実行することを許容する開発者の能力に悪影響を及ぼしています。それは、それらをうまく作成することについて規律付けられる動機に影響しています。主要なシナリオのみを前面から背面まで統合テストし、テストを実行するたびにゼロから構築される本番環境をミラーリングする環境を使用します。 実行に時間がかかるため、テスト実行の集中度に関係なく、ひどいフィードバックループが発生し、テスト実行の終了をマシンで待機する多くの無駄なサイクルが発生します。フローと進捗、健全性、持続可能性に対するより高価な悪影響を決して気にしないでください。 この製品の速度が低下し始める前に、10倍以上の統合テストが行​​われると予想されます(実際にはわかりませんが、機能に関してはまだ始まったばかりではありません)。私たちは、数百または数千の統合テストに合理的に期待する必要があります。 明確に言うと、これがユニットテストと統合テストの議論にならないようにしようとすることです。この製品では、TDDを使用した単体テストと統合テストの両方を行っています。実際、アーキテクチャのパターンを他の領域に変更する際に重大な変更を導入する場所を検証する必要があるため、私たちが理にかなっているサービスアーキテクチャのさまざまな層で統合テストを行いますシステム。 技術スタックについて少し。現在、テストをエンドツーエンドで実行するために、(CPUとメモリを集中的に使用する)エミュレーション環境でテストしています。これは、noSqlバックエンド(ATS)の前にあるAzure REST Webサービスで構成されています。Azureデスクトップエミュレーター+ IISExpressで実行することにより、運用環境をシミュレートしています。開発マシンごとに1つのエミュレータと1つのローカルバックエンドリポジトリに制限されています。 また、同じエミュレート環境で同じテストを実行するクラウドベースのCIもあり、現在のCIプロバイダーではクラウドでのテスト実行に2倍の時間がかかります(2時間以上)。ハードウェアパフォーマンスの観点からクラウドCIプロバイダーSLAの制限に達し、テスト実行時の許容値を超えました。公平を期すために、仕様は悪くはありませんが、社内の汚いデスクトップマシンの半分の品質であることは明らかです。 テストの論理グループごとにデータストアを再構築し、テストデータをプリロードするテスト戦略を使用しています。データの整合性を包括的に保証しながら、これにより各テストに5〜15%の影響が追加されます。したがって、製品開発のこの時点では、そのテスト戦略を最適化することはほとんど得られないと考えています。 長いことと短いことです。各テストのスループットを最適化できましたが(それぞれ30%〜50%であっても)、数百のテストで近い将来に効果的にスケーリングすることはありません。1時間は今でも人間の許容範囲をはるかに超えています。それを維持するには、全体のプロセスを1桁改善する必要があります。 そのため、テスト時間を大幅に短縮するために使用できる手法と戦略を調査しています。 より少ないテストを書くことはオプションではありません。このスレッドで議論しないでください。 非常に高価ですが、より高速なハードウェアを使用することは間違いなくオプションです。 並列の別個のハードウェアでテスト/シナリオのグループを実行することも、間違いなく推奨されるオプションです。 開発中の機能とシナリオに関するテストのグループ化を作成することはもっともらしいですが、最終的には、システムが変更の影響を受けないという完全なカバレッジまたは信頼性を証明することはできません。 デスクトップエミュレーターで実行する代わりに、クラウドスケールのステージング環境で実行することは技術的に可能ですが、テスト実行に展開時間を追加し始めます(テスト実行の開始時に、〜20分ごとに展開します)。 システムのコンポーネントを独立した対数部分に分割することはある程度妥当ですが、コンポーネント間の相互作用は時間とともに増加することが予想されるため、その上で限られた燃費が期待されます。(つまり、変更は他の人に予期しない形で影響を与える可能性が高い-システムがインクリメンタルに開発されるときによく起こるように) この分野で他の人がどの戦略(およびツール)を使用しているかを知りたかった。 (他の人が特定の技術セットを使用してこの種の困難に直面している可能性があると信じる必要があります。) [更新:2016年12月16日:結果の議論のため、CI並列テストにより多くの投資をすることになりました:http : //www.mindkin.co.nz/blog/2015/12/16/16-jobs]

8
別の関数のみを呼び出すパラメーターなしの関数の利点は何ですか
私がやっているチュートリアル(Javascript用)では、次のような関数を作成することをお勧めします。 function sayHello() { //Some comments explaining the next line window.alert("Hello"); } 難読化以外に、実際の生活でこのようなものを書くことには利点がありますか?もしそうなら、利点は何ですか?

5
ユーザーストーリーを開発者間で共有する必要がありますか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 5年前に閉鎖されました。 私は一般的に、バックエンドおよびフロントエンドの開発があるストーリーを見ます。たとえば、いくつかのテーブルといくつかの動的コントロールを備えた大きなダイアログを考えてみましょう。複数のストーリーを作成します(各テーブルに1つずつ、動的制御システムに1つずつ)。 その後、開発チームはバックエンドで1人、フロントエンドで1人に分割されます。これにより、バックエンドの人はSQLレイヤーの構造を心配するだけで済み、フロントエンドの人はレイアウトなどに集中できます。バックエンドとフロントエンドの間の最初のインターフェースが合意された後、2人の開発者はスプリントの終わりまでに自分の部分を成し遂げるために注意を集中できます。 それからカオスが来る。誰がどの物語を「所有」していますか?「進行中」とはどういう意味ですか?バックエンドとフロントエンドの2つの別々のストーリーを作成する必要がありますか?もしそうなら、それは機能に基づいたユーザーストーリーのアイデアを壊しませんか?私たちのシステムには「サブタスク」という概念があり、これらの問題のいくつかを緩和します。ただし、サブタスクはさらに複雑になります。もっと良い方法はありますか?これはスクラムを使用する「悪い」方法ですか? 過去数年間、いくつかの場所で何らかの形のアジャイルを使用しています。公式のトレーニングはまだありませんので、間違った用語やイデオロギーはご容赦ください。プロセスを改善する実用的な方法を学ぼうとしています。
21 agile  scrum 

3
アジャイル手法でイノベーションを可能にする方法[終了]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 5年前に閉鎖されました。 アジャイル方法論は、要件が十分に理解されていない設定で優れている、または重要な新規性が関係していると言うことは一つのことです。しかし、完全なイノベーションが必要な場合に適用すべきでしょうか?はいの場合、どのように? 考えていることが業界で不明であるか、不可能であると思われる場合でも、ユーザーストーリーと関連タスクを想像することは困難です。たとえば、アルバート・アインシュタイン(または彼が報告する仮想の雇用主)にとって、一般相対性理論を叙事詩、短距離走、および課題に分解することで考案したのは有益でしょうか?答えが「はい」の場合、アインシュタインのアプローチが革命的な洞察を達成するアジャイルのアプローチと最もうまく機能するのを助けるために、どの特別な宿泊施設が組み込まれるべきでしたか? 特定のソフトウェアの例を挙げると、2008年であり、WCFを使用してCOMETまたは「ロングポーリング」タイプの機能を提供したいと考えてください。「以前の仕事」に関するあなたの研究はすべて何も見つかりませんでしたし、MSDNのブロガーはそれが不可能だと言っていました。 繰り返しますが、この試みの発明性(または大胆さ)に対応するために、ユーザーストーリーおよびタスクにどのような調整または「フレーバー」を組み込むことができますか?それとも、その努力は非常に革新的であると結論付ける方が良いでしょうか(2008年)、それは無向のシンクタンクの練習として残すのが最善です。 2週間のスプリントで動作しているイノベーターは、デッドエンドタスクを放棄し、スプリントが定義されたときに想定されていなかった新たに発見されたタスクで作業を開始するたびに撃certainlyされることを望みません。同様に、スプリントが終了し、実行中のコードまたは実行中のアプローチが配信されない場合、イノベーターは経営陣に打ち倒されるべきではありません。このような状況でも、努力を「成功」とラベル付けする方法が必要です。おそらく、この種の「行き止まり」の追求の1つまたは3つ以上のスプリントで、イノベーターは最終的に機能する何かにぶつかります。 アジャイルは、革新的な後退にもかかわらず、各スプリントが「OK」であることを経営者がどのように知ることができるのですか?バーンダウンチャートが不合理に見えないように、これをどのように管理しますか?
21 agile 

4
LISPがあれば、マクロシステムの実装を容易にしますか?
私はSICPからSchemeを学んでいますが、Schemeを作るものの大きな部分、さらにLISPが特別なのはマクロシステムであるという印象を受けています。しかし、マクロはコンパイル時に拡張されるので、C / Python / Java / whateverに同等のマクロシステムを作成しないのはなぜですか?たとえば、pythonコマンドをexpand-macros | python何にでもバインドできます。このコードは、マクロシステムを使用しないユーザーにも移植可能です。コードを公開する前にマクロを拡張するだけです。しかし、私が収集したC ++ / Haskellのテンプレートを除いて、私はそのようなものを知りません。実際には同じではありません。LISPがあれば、マクロシステムの実装を容易にしますか?

5
コンストラクタをどのように分解できますか?
私にはEnemyクラスがあり、コンストラクタは次のようになります。 public Enemy(String name, float width, float height, Vector2 position, float speed, int maxHp, int attackDamage, int defense... etc.){} コンストラクターには非常に多くのパラメーターがあるため、これは悪いように見えますが、Enemyインスタンスを作成するときは、これらすべてを指定する必要があります。また、これらの属性をEnemyクラスに含めて、それらのリストを反復処理し、これらのパラメーターを取得/設定できるようにします。EnemyをEnemyB、EnemyAにサブクラス化して、maxHpなどの特定の属性をハードコーディングすることを考えていましたが、Enemyのリスト(EnemyA、EnemyB、およびEnemyC's)。 私はただきれいにコーディングする方法を学ぼうとしています。違いがあれば、Java / C ++ / C#で作業しています。正しい方向の任意のポイントが高く評価されています。

3
多くの言語が、0で始まる数字を8進数として扱うのはなぜですか?
オクタルはどこで役立ちますか?オクタルは昔々便利だったようです。 多くの言語は、0で始まる数字を8進数として扱うため、010実際にはリテラルは8です。これらの中には、JavaScript、Python(2.7)、およびRubyがあります。 しかし、特にこれらの言語が8進数を必要とする理由はわかりません。特に、表記法のより可能性の高い使用法は、余分な0で10進数を示すことです。 JavaScriptはクライアント側の言語であり、8進数はほとんど役に立たないようです。他の意味では3つすべてがかなり現代的であり、この「機能」を削除すると壊れる8進表記を使用したコードが多くなるとは思いません。 だから、私の質問は: これらの言語が8進リテラルをサポートしている点はありますか? 8進リテラルが必要な場合は、次のようなものを使用してみません0o10か?より有用なユースケースを無効にする古い表記をコピーするのはなぜですか?


8
デザインパターンを抑制する
何年も前、私は経済学の教授と、デザインパターン、プログラマー向けの共通言語の確立方法、よく知られている問題をうまく解決する方法などについて話していました。 それから彼は、これは彼が経済学の学生に使用するのとまったく反対のアプローチであると私に話しました。彼は通常問題を提示し、最初に解決策を見つけるように依頼したので、彼らは最初にそれについて考え、最初に問題を解決する方法を見つけようと試みました。 だから私は、「デザインパターン」アプローチが本当にプログラマーを賢くするのか、または愚かなものにするのかと考えていました。新しい革新的な方法。 どう思いますか?

7
後で実行するためにSQLステートメントをテーブルに保存するのは悪い考えですか?
後で実行するためにSQLステートメントをMySQLテーブルに保存するのは悪い考えですか?SQLステートメントの実行準備が整います。つまり、スワップするパラメーターなどはありませんDELETE FROM users WHERE id=1。 私は怠けていると思いますが、SQLステートメントを定期的に実行するかなりの数のcronジョブを必要とするプロジェクトに取り組んでいるので、このアイデアを考えました。
21 mysql 

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