ソフトウェア工学

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

5
関数型プログラミング:並行性と状態に関する正しいアイデア?
FP支持者は、パラダイムが可変状態を回避するため、並行性は簡単であると主張しています。わかりません。 FPを使用して、純粋な機能と不変のデータ構造を強調するマルチプレイヤーダンジョンクロール(ローグライクゲーム)を作成していると想像してください。部屋、廊下、ヒーロー、モンスター、戦利品で構成されるダンジョンを生成します。私たちの世界は、事実上、構造とそれらの関係のオブジェクトグラフです。物事が変化すると、世界の表現はそれらの変化を反映するように修正されます。私たちのヒーローはネズミを殺したり、短剣を拾ったりします。 私にとって、世界(現在の現実)はこの状態の考え方を持ち、FPがこれをどのように克服するのか見逃しています。ヒーローが行動を起こすと、機能が世界の状態を修正します。すべての決定(AIまたは人間)は、現在の世界の状態に基づいて行う必要があるようです。並行性はどこで許可しますか?複数のプロセスが並行して世界の状態を修正することはできません。1つのプロセスの結果が期限切れの状態に基づいていることはありません。世界の現在のオブジェクトグラフで表される現在の状態を常に処理しているように、すべての制御は単一の制御ループ内で行われるべきだと感じています。 明らかに、並行性に完全に適した状況があります(つまり、状態が互いに独立している孤立したタスクを処理する場合)。 私の例では並行性がどのように役立つかを確認できず、それが問題になる可能性があります。私は何らかの形で主張を誤って伝えているかもしれません。 誰かがこの主張をよりよく表現できますか?

6
関数とswitchステートメントのマップ
私はリクエストを処理するプロジェクトに取り組んでおり、リクエストにはコマンドとパラメーターの2つのコンポーネントがあります。各コマンドのハンドラーは非常にシンプルです(<10行、多くの場合<5)。少なくとも20のコマンドがあり、50を超える可能性があります。 私はいくつかの解決策を考え出しました: コマンド上の1つの大きなスイッチ/ if-else 機能へのコマンドのマップ 静的クラス/シングルトンへのコマンドのマップ 各コマンドは少しエラーチェックを行い、抽象化できるビットは、各コマンドに定義されているパラメーターの数をチェックすることだけです。 この問題の最善の解決策は何ですか?また、その理由は何ですか?また、私が見逃したかもしれないデザインパターンにもオープンです。 それぞれについて、次の賛否両論のリストを作成しました。 スイッチ 長所 すべてのコマンドを1つの関数に保持します。シンプルなので、これは視覚的なルックアップテーブルになります 1か所でしか使用されない大量の小さな関数/クラスでソースを乱雑にする必要はありません。 短所 とても長い プログラムでコマンドを追加するのが難しい(デフォルトのケースを使用してチェーンする必要がある) マップコマンド->関数 長所 小さい一口サイズのチャンク プログラムでコマンドを追加/削除できる 短所 インラインで行う場合、スイッチと視覚的に同じ インラインで行われない場合、多くの機能が1か所でのみ使用されます マップコマンド->静的クラス/シングルトン 長所 ポリモーフィズムを使用して単純なエラーチェックを処理できます(3行だけですが、それでも) マップと同様のメリット->機能ソリューション 短所 多くの非常に小さなクラスがプロジェクトを混乱させます 実装がすべて同じ場所にあるわけではないため、実装をスキャンするのは簡単ではありません 追加のメモ: 私はGoでこれを書いていますが、ソリューションは言語固有のものではないと思います。他の言語でも非常に似たようなことをする必要があるかもしれないので、私はより一般的な解決策を探しています。 コマンドは文字列ですが、便利であれば、これを簡単に数値にマップできます。関数のシグネチャは次のようなものです。 Reply Command(List<String> params) Goにはトップレベルの機能があり、私が検討している他のプラットフォームにもトップレベルの機能があるため、2番目と3番目のオプションの違いがあります。

3
過度のモッキングが必要なため、脆弱な単体テスト
私は、チームで実装しているユニットテストに関して、ますます厄介な問題に取り組んでいます。うまく設計されていないユニットコードをレガシーコードに追加しようとしていますが、実際にテストを追加するのに苦労することはありませんが、テストの結果に苦労し始めています。 問題の例として、実行の一部として5つの他のメソッドを呼び出すメソッドがあるとしましょう。このメソッドのテストは、これらの5つのメソッドのいずれかが呼び出された結果として動作が発生することを確認することです。そのため、単体テストは1つの理由と1つの理由でのみ失敗するはずなので、これらの他の4つのメソッドを呼び出して発生する潜在的な問題を排除し、それらをモックアウトする必要があります。すばらしいです!単体テストが実行され、モックされたメソッドは無視され(その動作は他の単体テストの一部として確認できます)、検証が機能します。 しかし、新しい問題があります-単体テストには、今後、他の4つのメソッドのいずれかに対する動作とシグネチャの変更、または「親メソッド」に追加する必要のある新しいメソッドの確認方法に関する詳細な知識があります。失敗の可能性を回避するために、単体テストを変更する必要があります。 当然のことながら、より多くのメソッドがより少ない動作を達成するようにするだけで、問題を多少軽減できますが、おそらくよりエレガントなソリューションが利用できることを望んでいました。 問題をキャプチャする単体テストの例を次に示します。 簡単なメモとして、「MergeTests」は単体テストクラスであり、テストしているクラスから継承し、必要に応じて動作をオーバーライドします。これは、外部クラス/依存関係への呼び出しをオーバーライドできるようにするためにテストで使用する「パターン」です。 [TestMethod] public void VerifyMergeStopsSpinner() { var mockViewModel = new Mock<MergeTests> { CallBase = true }; var mockMergeInfo = new MergeInfo(Mock.Of<IClaim>(), Mock.Of<IClaim>(), It.IsAny<bool>()); mockViewModel.Setup(m => m.ClaimView).Returns(Mock.Of<IClaimView>); mockViewModel.Setup( m => m.TryMergeClaims(It.IsAny<Func<bool>>(), It.IsAny<IClaim>(), It.IsAny<IClaim>(), It.IsAny<bool>(), It.IsAny<bool>())); mockViewModel.Setup(m => m.GetSourceClaimAndTargetClaimByMergeState(It.IsAny<MergeState>())).Returns(mockMergeInfo); mockViewModel.Setup(m => m.SwitchToOverviewTab()); mockViewModel.Setup(m => m.IncrementSaveRequiredNotification()); mockViewModel.Setup(m => …

4
PUTまたはDELETEでコレクションを部分的に変更しても大丈夫ですか?
製品グループに製品のコレクションがあります。例: product-groups/123/products コレクションに追加する必要がある場合、PUTを使用して一部の製品のみを渡すことはできますか? コレクションからいくつかの製品を削除する必要がある場合、フィルターデータ(IDの配列)をDELETEで渡しても大丈夫ですか? ReSTの精神で機能を実装する最良の方法は何ですか? 編集:アイテムは個別のエンティティ、基本的には製品のIDへのリンクです。
21 rest  collections 

5
巨大な接着方法を避ける方法は?
私の現在の仕事では、古いコードを数回クリーンアップする仕事をしました。多くの場合、コードは迷路であり、その背後のデータはさらに複雑です。私は物事をすてきな、きちんとした、モジュール式の方法にまとめると思います。各メソッドは1つのことを行い、それをうまく行います。それは物事が南に行き始めるときです... 常に、私はきれいなAPIになり、それをすべて結びつける実際の方法はありません。解決策は、最終的にすべての「クリーン」メソッドを呼び出す、大きない「グルー」メソッド(通常は条件ステートメントでいっぱい)を記述することです。 通常、glueメソッドは、クリーンアップしようとしたコード/データのもつれの簡潔なバージョンになります。一般的に読みやすいですが、それでもいらいらします。 そのような方法を避けるにはどうすればよいですか?これはもつれたデータの症状なのでしょうか、それとも私が間違っていることを反映しているのでしょうか?

8
上級プログラマーの自信を取り戻す[終了]
現在のところ、この質問はQ&A形式には適していません。回答は、事実、参考文献、または専門知識によってサポートされると予想されますが、この質問は、議論、議論、世論調査、または広範な議論を求める可能性があります。この質問を改善し、場合によっては再開できると思われる場合は、ヘルプセンターをご覧ください。 6年前に閉鎖されました。 私の上司は、私が彼が思ったほど賢くないことを知った。 私の経験からの例: 私はジュニアプログラマーであり、上司(シニアプログラマー)と私自身の2つのチームで働いています。 私は、私たちが働いている会社の内部Webアプリケーションの開発を任されました。バックエンドをフロントエンドに作成しました(データベース設計はすでに整っていて、サーバーテクノロジーが選択されていました)。彼は、動作中のWebアプリケーションを観察することで定期的に私の進捗状況をチェックし、それがやってくるのを喜んでいた。私がウェブアプリを完成させたとき、彼は最終製品がどれほどうまくできたか喜んでいた。 数日前、彼はコードに興味を持つようになったので、私は(フロントエンド用に)私がどのテクノロジーを使用したかを彼に話しました。Webアプリのフロントエンドには、Javascriptフレームワーク(Backbone.js)を使用しました。なぜそんなことをするのかと聞かれたとき。私の応答は、フレームワークがこのアプリに非常にうまく適合し、最初から作成した場合よりもコードをよりよく構築するのに役立つと感じたためです。...「まあ、それは気分を害します」彼の応答でした。 したがって、この例を考えると私の質問は: 上級プログラマーであり、ジュニアプログラマーの能力に自信を失った場合、自信を取り戻すために後輩から何を見たいですか? 編集:素晴らしい回答と協力的なフィードバックをありがとう!

5
上司(および他の開発者)に控えめなJavaScriptを使用/検討するよう説得するにはどうすればよいですか
私は開発チームでかなり新しいです。 いくつかの強力な議論や「落とし穴」の例が必要なので、上司は最終的にUnobtrusive JavaScriptの利点を理解し、彼とチームの他のメンバーがこのようなことをやめるようにします。 <input type="button" class="bow-chicka-wow-wow" onclick="send_some_ajax(); return false;" value="click me..." /> そして <script type="text/javascript"> function send_some_ajax() { // bunch of code ... BUT using jQuery !!! } </script> かなり一般的なパターンを使用することをお勧めします。 <button id="ajaxer" type="button">click me...</button> そして <script type="text/javascript"> // since #ajaxer is also delivered via ajax, I bind events to document …

2
REST APIの認証を実装する最良の方法
モバイル向けのソーシャルベースのアプリケーションを開発しています。すべてのアプリケーションはRESTful API Webサービスを使用します。ログインを実装するとき、通常はユーザー名とパスワードをデバイスのどこかに保存します。次に、それらを送信し、応答として自分のプロファイルにアクセスします。しかし、これを行う別の方法があることも知っています。 何らかの方法で特定のアルゴリズムでトークンを生成し、ユーザー名とパスワードの代わりにトークンを送信してアクセスを取得します。 どうすれば実装できますか?このトークンをログイン以外のすべてのリクエストとともに送信する必要がありますか?
21 mobile  rest  login 

9
アジャイル開発では、データベースの前にフラットファイルで永続化を試みる必要がありますか?
アジャイル開発では、ポリシーとアプリケーションロジックは永続化メソッドなどの詳細よりも重要であるため、最後に永続化の決定を下す必要があると誰かが説明してくれました。したがって、この方法の弱点が明らかになるまでフラットファイルなどのより単純な永続性から始めてから、リレーショナルデータベースなどを使用して永続性を変更することをお勧めします。 これは本当ですか、それともコンセプトを誤解しましたか?これはアジャイルチームが通常どのようにアプリケーションを構築するのですか?その理由は何ですか?また、このアプローチを採用すべきではないのはいつですか?

1
アップストリームリポジトリへの貢献とアップストリームリポジトリからの分岐を同時に行うための適切なエチケットと推奨されるGitHubワークフローとは何ですか?
私はGitHubとVCS全般に不慣れです。私は何年もさまざまな言語でプログラミングを行ってきましたが、カスタムプロジェクトでは常に単独で作業していました(公開リリースはありません)。最近、作業中のプロジェクトでGitHubからダウンロードしたjQuery UIウィジェットの使用を開始しました。リポジトリは元の作成者によって維持されなくなりました。別のフォークには、元のプルリクエストの一部が組み込まれています。これは私がフォークしたものです。 いくつかのバグを発見し、それらの修正を考え出しました。私はこれらの修正に貢献したいと思いますが、私たち自身の使用のために、既存の機能のいくつかを破壊する他の多くの変更もしたいと思います。さらに、別のフォークのアイデアを取り入れたいと思います。 私はまだGITとGitHubを学んでおり、あらゆることを行うための最善の方法を見つけようとしています。さまざまな概念/タスク(ワークフロー、マージ、プルリクエスト、チェリーピッキング、リベース、ブランチ)について多くの読書(ここでは、SO、GitHubヘルプページ、Pro Git)を行いました。私の灰白質は泳いでいるので、読み始めたことを理解するために、始めなければなりません。 主な問題: 私は(どこかに)一度にブランチ上でプルリクエストを1つしか持つことができないと読んだと思います。つまり、バグごとに個別のブランチを作成し、それぞれに個別のプルリクエストを実行する必要があるということですか? 空白の問題をクリーンアップしたいのですが、これを別のコミットで行うのが最善であると読んだことを覚えているようです。これをマスターまたは別のブランチで行う必要がありますか?些細なことに対してプルリクエストをしたくありませんが、ブランチする前に空白を変更すると、バグ修正のためのプルリクエストに影響しますか?一部のフォークは空白のクリーンアップを行い、事実上、diffをかなり役に立たなくしました。 私はすでにバグを修正しているにもかかわらず、バグを文書化する方法として、フォークに対して問題を作成することを考えていました。それは良い考えですか?問題、コミット、およびマスターへのマージをリンクするにはどうすればよいですか?アップストリームでプルリクエストを行うと、問題もアップストリームに表示されますか、それともドキュメントのリンクが失われますか?アップストリームリポジトリに対して問題を開くことができません([問題]タブはありません)。 私が使用したい他のフォーク作成者のアイデアを他のフォーク作成者に与える最良の方法は何ですか?特に彼の変更はアップストリームの古いバージョンに対して適用され、他の変更とは互換性がないため、私は彼のコードを正確に使用することはできません。しかし、私はこのアイデアを使いたいですし、クレジットが支払われるべきところでクレジットを与えたいです。コミットメッセージで彼のレポ(またはプロファイルまたは特定のコミット)にリンクするだけですか? メインファイルの上部にあるREADMEファイルとDocBlockの変更に関するエチケットは何ですか?変更を行い、名前を追加し、リポジトリとデモへのリンクを追加し、元のデモへのリンクを削除しても構いません(私のフォークは元のデモと互換性がないため)もちろん、元の著者名とライセンス情報は残しておきます。記録のために、それはMITライセンスの下でライセンスされています。 VCSを使用したことがないソロ開発者として、私はhistoryを書き換えることに慣れています。私は完璧主義者で、きちんと整理整頓することが好きです。歴史を記録するという考えは私を少し緊張させています。プレイ/学習するための新しいリポジトリを作成しましたが、jQuery UIウィジェットの修正を進めて、プロジェクトを進めることができるようになりたいと思っています。


7
REST APIクライアントとしてのWebアプリケーション:リソース識別子を処理する方法
RESTを実装しようとすると、RESTに関連するいくつかの概念が頭の中で競合します。 ビジネスロジックを保持するRESTフルバックエンドAPIシステムと、UIを提供するWebアプリケーションがあります。RESTに関するさまざまなリソース(特に、REST in Practice:Hypermedia and Systems Architecture)から、エンティティの生の識別子を公開せず、でハイパーリンクを返す必要があることを知っていrel="self"ます。 例を考えてみましょう。REST APIには、人を返すリソースがあります。 <Person> <Links> <Link rel="self" href="http://my.rest.api/api/person/1234"/> </Links> <Pets> <Link rel="pet" href="http://my.rest.api/api/pet/678"/> </Pets> </Person> 問題はWebアプリケーションで発生します。ブラウザへのハイパーリンクを含むページを返すと仮定しましょう: <body class="person"> <p> <a href="http://my.web.app/pet/???????" /> </p> </body> href属性に何を入れるべきですか?ユーザーがターゲットページを開いたときにエンティティを取得できるように、WebアプリケーションにAPIエンティティURLを保持するにはどうすればよいですか? 要件は矛盾しているようです: ハイパーリンクhrefは、UIをホストするシステムであるため、Webアプリケーションにつながるはずです hrefウェブアプリが対象ページが開いたときに、エンティティに対処することができなければならないので、エンティティのいくつかのIDを持っている必要があります WebアプリはRESTに対応していないため、REST URLを解析/構築しないでください。 URIは消費者に対して不透明でなければなりません。URIの発行者だけが、それを解釈してリソースにマップする方法を知っています。 その1234ため、RESTfulクライアントとしてのように扱う必要があるため、API応答URLから取得することはできませんhttp://my.rest.api/api/AGRIDd~ryPQZ^$RjEL0j。一方、WebアプリにつながるURLを指定する必要があり、アプリが何らかの方法でAPIの元のURLを復元し、そのURLを使用してAPIリソースにアクセスするには十分です。 最も簡単な方法は、おそらくリソースのAPI URLを文字列識別子として使用することです。しかし、そのようなWebページのURL http://my.web.app/person/http%3A%2F%2Fmy.rest.api%2Fapi%2Fperson%2F1234は見苦しいです。 デスクトップアプリや単一ページのjavascriptアプリにとっては、すべて簡単に思えます。彼らは継続的に生きているので、アプリケーションの存続期間中、サービスオブジェクトとともにURLをメモリに保持し、必要なときにそれらを使用することができます。 Webアプリでは、いくつかのアプローチを想像できますが、すべてが奇妙に見えます: API URLのホストを置き換えて、結果のみを保持します。大きな欠点は、APIが生成するURLを処理するためにWebアプリケーションが必要になることです。つまり、巨大な結合を意味します。さらに、私のWebアプリがURLの解釈を開始するため、再びRESTfulではありません。 REST APIで生のIDをリンクとともに公開し、それらを使用してWebアプリのURLを作成し、WebアプリサーバーでIDを使用してAPIで必要なリソースを見つけます。これは優れていますが、Webアプリはブラウザーからの要求を処理するために何らかのフォームのget-by-id要求のチェーンを発行するRESTサービスナビゲーションを通過する必要があるため、Webアプリサーバーのパフォーマンスに影響します。ある程度ネストされたリソースの場合、これにはコストがかかる場合があります。 selfAPIから返されたすべてのURLをWebアプリサーバーの永続的な(DB?)マッピングに保存します。それらのIDを生成し、IDを使用してWebアプリページのURLを構築し、RESTサービスリソースのURLを取得します。つまり、http://my.rest.api/pet/678URLを新しいキー(たとえば3)で保持し、WebページのURLをとして生成しますhttp://my.web.app/pet/3。これは、ある種のHTTPキャッシュ実装のように見えます。理由はわかりませんが、奇妙に思えます。 または、それはすべて、RESTful APIがWebアプリケーションのバックエンドとして機能できないことを意味しますか?

2
顧客から受け取った非構造化要件を管理および推定する方法
プロジェクトの入札段階では、多くの場合、潜在的な顧客からソフトウェアシステムの要件をさまざまなソース[メール、ワードドキュメント、Excel]から非常に非構造化された形式で受け取ります。通常、彼らが抱えるビジネス上の問題に対するこれらの「提案された解決策」を考え出すのは、顧客側からの「製品開発」担当者の集まりです。彼らはビジネス分野の専門家ですが、多くの場合、彼らは正しい解決策を持っていません。 これにより 同じ要件の複数のバージョン 2つの要件を1つに混ぜる 後の要件のいくつかのバージョンでは、一緒に結合された要件が再び分離され、それぞれが新しい追加の一部を取ります 開発を開始する前に、このような要件をどのように処理し、適切なユースケースに分類しますか?特定の要件の履歴を追跡するために、最初に考案されてから適切なユースケースに結晶化するまで、どのツールを使用できますか?このような方法で受け取った要件に対する作業の見積もりは、要件を正しく理解し、それに対する作業を正しく見積もるのを間違えてしまうという悪夢です。 私たちがプロジェクトに勝った後、顧客は自分の要件をさらに考え、適切にそれを明確にすることができました。この場合に発生することは、一部の機能が削除され、一部が機能強化され、一部がまったく新しい方向に進むことです。これは基本的に、プロジェクトに勝つ前に行われた作業項目の見積もりの​​一部を無効にする可能性があります。特定の要件のツリーを構築できるシステムがあるかどうか、および各ブランチがどのように異なる推定値をもたらすかを知りたいと思います。 このアクティビティをより管理しやすくするためのヒント、ツール、トリックはありますか?要件管理や労力の見積もりよりも経験豊富な人から洞察を得ようとしています。

5
コード内のすべての数字は「マジックナンバー」と見なされますか?
したがって、引数としてメソッドに送信するコード内のすべての数値は、マジックナンバーと見なされますか?私には、そうすべきではありません。いくつかの数字がユーザー名の最小長であるとしましょう。コードで「6」を使用し始めます...それからメンテナンスの問題があり、ここで「6」は魔法の数字です...引数の1つが、たとえばコレクションのi番目のメンバーとして整数を受け入れるメソッドを呼び出している場合、そのメソッド呼び出しに「0」を渡すと、この場合、「0」が魔法として表示されません数。どう思いますか?

5
静的リンクを許可する変更されたLGPLライセンスはありますか?
LGPLでは、プログラムがLGPLで編集されたライブラリを使用する場合、ユーザーはプログラムを別のバージョンのライブラリと再リンクできる必要があります。 ... d)次のいずれかを実行します。 0)このライセンスの条件の下で最小限の対応するソース、および適切な形式で対応するアプリケーションコードを伝え、ユーザーがアプリケーションをリンクバージョンの修正バージョンと再結合または再リンクして、対応するソースを伝えるためにGNU GPLのセクション6で指定された方法で、変更された結合作業。 1)適切な共有ライブラリメカニズムを使用して、ライブラリとリンクします。適切なメカニズムは、(a)ユーザーのコンピューターシステムに既に存在するライブラリのコピーを実行時に使用し、(b)リンクバージョンとインターフェイス互換性のあるライブラリの修正バージョンで適切に動作するメカニズムです。 ... ただし、場合によっては、これによりかなりの困難が生じる可能性があります。特に、Haskellプログラムはほとんど常に静的にコンパイルされます。さらに、コンパイラはモジュール間の最適化を行うため、コードの一部を取り出して別のものに置き換えることはできません。したがって、この条件を満たすことは非常に困難です。(Haskell Wikiのこのリンクを参照してください。) 動的リンクが解決策になりますが、多くの場合、これは不可能です。例えば: プラットフォームによっては、動的リンクがまったくない場合があります。 一部の言語には、動的リンクの可能性がありません。または、モジュールをマルチプラットフォームにすることはできません。 場合によっては、動的リンクによって重要な最適化が妨げられます。これが深刻な問題になることはめったにないと思いますが、Haskellのような言語では、パフォーマンスの損失がかなり大きくなる可能性があります。 したがって、再リンクの可能性を必要としない標準のLGPLのようなライセンスを探しています(そして、それはユーザーに与えられた少しの自由を取り除くことを理解しています)。wxWidgetsなど、一部のプロジェクトではLGPLの独自の変更を使用しています。しかし、私はむしろ、いくつかの法律の専門家によってチェックされ、(L)GPLと互換性のある、より公式な標準ライセンスを使用したいと考えています。そのようなものはありますか? (また、LGPLのそのような修正の予期しない結果があるかどうかを知りたいと思います。)

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