ソフトウェア工学

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

4
単体テストで、なぜリポジトリを2回作成するのですか?
先日、ユニットテストについて少し読んでいて、人々がリポジトリインターフェイス(つまりIExampleRepository)を作成してから、実際のリポジトリ(public class ExampleRepository : IExampleRepository)とユニットテストに使用するリポジトリ()を作成する例をいくつか見ましたFakeExampleRepository : IExampleRepository。 IExampleRepositoryそれらはと同じ方法を実施したExampleRepositoryが、異なるLINQクエリと、。 ここの目的は何ですか?コードの単体テストの一部は、メソッドが正しく機能することを確認することだと思いましたか?しかし、「実際の」クエリとテスト内のクエリの2つのまったく異なるクエリを使用すると、テストはどの程度意味がありますか?

2
非同期タスクライブラリは例外を静かに飲み込む必要がありますか?
.NET 4.5 Taskが内の例外の処理方法に変更を導入したことを知りました。つまり、それらは静かに抑制されます。 これが行われた理由の公式の推論は、「経験の浅い開発者によりフレンドリーになりたかった」ようです。 .NET 4.5では、タスクは.NET 4でのタスクよりもはるかに目立つようになりました。タスクは、言語でサポートされる新しい非同期機能の一部としてC#およびVisual Basic言語に組み込まれているためです。これは事実上、タスクを経験豊富な開発者のドメインからすべての人の領域に移動します。その結果、例外処理の厳格さに関するトレードオフの新しいセットにもつながります。 (ソース) .NETでの決定の多くは、自分が何をしているのかを本当に理解している人たちによって行われたものであり、通常、彼らが決定することの背後には非常に正当な理由があると信じています。しかし、これは私を逃れます。 独自の非同期タスクライブラリを設計している場合、フレームワークの開発者が私が見ていなかったと認識した例外を飲み込むことの利点は何ですか?
10 .net 

3
大きなメソッドをリファクタリングして何も壊さないようにする場合、何が役立ちますか?
私は現在、大規模なコードベースの一部をリファクタリングしており、ユニットテストはまったくありません。私は力ずくでコードをリファクタリングしようとしました。つまり、コードが何をしていてどのような変更が意味を変えないかを推測しようとしましたが、成功しませんでした。コードベースのすべての機能をランダムに破壊しました。 リファクタリングには、レガシーC#コードをより機能的なスタイルに移行すること(レガシーコードはLINQを含む.NET Framework 3以降の機能を使用しません)、コードのメリットがあるジェネリックの追加などが含まれることに注意してください。 費用がいくらかかかるので、正式な方法は使用できません。 一方、少なくとも「リファクタリングされたレガシーコードにはユニットテストが付属する」というルールは、いくらコストがかかっても、厳密に従うべきだと思います。問題は、500 LOCプライベートメソッドのごく一部をリファクタリングするときに、単体テストを追加することが難しいように見えることです。 特定のコードに関連する単体テストを知るのに役立つものは何ですか?コードの静的分析が何らかの形で役立つと思いますが、次の目的で使用できるツールと手法は何ですか。 どのユニットテストを作成すればよいかを正確に把握し、 そして/または私が行った変更が元のコードに影響を及ぼし、今とは異なる方法で実行されているかどうかを知っていますか?

2
クライアントが不合理なものを要求したときの対応(私の観点から)
私はフリーランスのプログラマーで、最近ウェブサイトを完成させましたが、すべてうまくいきましたが、クライアントにログインできないと不平を言うユーザーがいました。私自身で問題を作成するのではなく、ユーザーの何十人もがウェブサイトでうまく働いています) 今、私のクライアントは言った:私は何かをするためにあなたにお金を払った、そして誰かが不満を言う それであなたはあなたの仕事を正しくしませんでした。 この状況で私は何ができますか?

1
非同期の内部通信を処理するためのベストプラクティス?
最近、クレジットカード処理を扱うプロジェクトを完了しました。私が直面した問題の1つは、通知メッセージの遅延/起こりうる失敗の処理でした。最も複雑な例は次のとおりです。 支払い要求を送信する外部システム 私のシステムはその要求を支払いゲートウェイへの要求に変えます ユーザーをゲートウェイに送信する ユーザーが支払いを実行するのを待っています ユーザーがシステムに戻ったが、システムが成功/失敗の通知を受け取るまで保留される 失敗に応じてユーザーを外部システムに送り返す さらに困難だったのは、通知の送信に失敗すると、ゲートウェイは15分ごとに何時間も通知を送信しようとすることでした。 保留中のトランザクションのデータベースレコードを使用して解決し、リターンからの成功と失敗に加えて、通知とトランザクション処理のための時限遅延リスナーを検出しました... かなり難しい! しかし、これは何億回も前に解決されたに違いないので、ベストプラクティスは何ですか? 私の将来は、これらすべてのシステム間の処理を記述し、時間遅延と起こりうるネットワーク障害を管理することになるので、ベストプラクティスに従いたいと思います。 本/記事の推奨事項は素晴らしいでしょう。 前もって感謝します!

10
ユーザーストーリーは高レベルで概念的であり、経営陣は開発者が空白を埋めることを期待しています
私は、XPを実行するという真の意図を持つ非常に優れた会社で働いています。コミュニケーションは良好で、経営陣は建設的な議論を受け入れることができますが、差し迫った時間の制約があるため、RUPで議論することができないものもあると見なされています。 現時点では、ストーリーの実装中に必要となる変更の量に少し悩んでいます。これらの発見の多く(もちろん時間と労力がかかります)は、ストーリー作成者(顧客、エンドユーザー、製品所有者)の責任であり、開発者の責任ではないかと思います。簡単に言うと、ユーザーストーリーは概念的すぎて、根本的な意図を伝えているだけですが、十分な詳細(特に、前提条件と事後条件、他のストーリーとの関連性、依存関係など)が不足しています。開発者は、XPの開発者がデザイナーとアナリストを兼ねているため、独自の裁量で空白を埋めることが期待されています。問題は、これらの空白の多くが、最初の予想よりも複雑さが増していることに気付いてから、いくつかの誤った仮定が評価時間とコードに組み込まれた後に発見されることです。それでも適切な項目を見つけるには時間がかかります。これは、さまざまな程度で、初期の見積もりからの逸脱と見なされます。 私は、これらの影響を経営陣に伝える建設的な方法を探しています。不必要に物事を複雑にしようとしている人として私を装うような方法ではありません。私は新しいですが、まだ信頼性を確立していません。 あなたの洞察は大歓迎です。 密接に関連し、どういうわけか答えを与える:開発者はユーザーストーリーの詳細をどのくらい期待できますか?

3
if()の遅延評価を実装する方法
私は現在、以下に基づいて式エバリュエーター(式のような単一行式)を実装しています。 入力された式は、リテラルブール、整数、小数、文字列、関数、識別子(変数)を分離するためにトークン化されます シャンティングヤードアルゴリズムを実装し(可変数の引数を持つ関数を処理するように少し変更)、括弧を取り除き、適切な優先順位で演算子を後置された順序で並べます 私のシャンティングヤードは、トークンの(シミュレートされた)キューを単に生成します(配列によって、Powerbuilder Classic言語はオブジェクトを定義できますが、ネイティブストレージとしてのみ動的配列を持ちます-真のリストではなく、ディクショナリーではありません)。シンプルなスタックマシン 私の評価者はうまく働いていますが、私はまだ足りないので、if()どうすればいいのか迷っています。 私のシャンティングヤードのポストフィックスおよびスタックベースの評価if()で、trueとfalseの部分を持つ別の関数として追加すると、1つif(true, msgbox("ok"), msgbox("not ok"))で両方のメッセージが表示され、1つだけ表示したいとします。これは、関数を評価する必要がある場合、その引数はすべて評価済みでスタックに配置されているためです。 if()怠惰な方法で実装する方法を教えてもらえますか? 私はこれらを一種のマクロとして処理することについて考えましたが、初期の段階ではまだ条件の評価ができていません。おそらく、キューとは別の種類の構造を使用して、条件とtrue / false式を別々に保持する必要があるのでしょうか?現時点では、式は評価前に解析されますが、将来の評価のために中間表現を一種のプリコンパイルされた式として保存することも計画しています。 編集:問題について少し後で、私は自分の式のツリー表現(線形トークンストリームの代わりにAST)を構築でき、そこから自分のの別のブランチを簡単に無視できると思いif()ます。

3
暗黙の引数変換に依存することは危険だと考えられていますか?
C ++には、引数の型が予期されたものでない場合に、パラメーターの型の一致するコンストラクターを自動的に呼び出す機能があります(適切な名前はわかりません)。 これの非常に基本的な例はstd::string、const char*引数付きのを期待する関数の呼び出しです。コンパイラーは、適切なstd::stringコンストラクターを呼び出すコードを自動的に生成します。 読みやすさに関しては、私が思うほど悪いのでしょうか。 次に例を示します。 class Texture { public: Texture(const std::string& imageFile); }; class Renderer { public: void Draw(const Texture& texture); }; Renderer renderer; std::string path = "foo.png"; renderer.Draw(path); いいですか?それとも行き過ぎですか?私がそれをするべきではない場合、どういうわけかClangまたはGCCにそれについて警告させることができますか?

1
独自のAPIに最適なデータ構造
Stack Exchangeネットワーク用のEmacsメジャーモードを作成する初期段階です。Emacsを定期的に使用している場合、これは最終的にあなたに利益をもたらします。 Stack ExchangeのAPI (1日あたりIPあたり10000を上限とする)への呼び出し数を最小限に抑え、一般的に責任のある市民になるために、ネットワークから受信した情報をキャッシュしてメモリに保存し、再びアクセスされます。この情報を格納するためのデータ構造について、私は本当に行き詰っています。 明らかに、これはリストになります。ただし、他のデータ構造と同様に、どのデータが格納され、どのようにアクセスされるかによって、選択を決定する必要があります。何、このようなすべての情報をなどの単一の記号に格納できるようにしたいのstack-api/cacheですが。だから、さらなるstack-api/cache騒ぎなしで、最後の更新によってキー付けされたconsesのリストです: `(<csite> <csite> <csite>) どこに<csite>なるでしょう (1362501715 . <site>) この時点では、単純な関連リストを定義するだけです。もちろん、もっと深く行く必要があります。 それぞれ<site>がAPIパラメータ(一意)のリストであり、その後に質問のリストが続きます。 `("codereview" <cquestion> <cquestion> <cquestion>) それぞれ<cquestion>が、あなたが推測したとおり、最後の更新時間に関する質問の短所です。 `(1362501715 <question>) (1362501720 . <question>) <question>question構造と回答のリストの短所です(ここでも、最終更新時間と見なされます)。 `(<question-structure> <canswer> <canswer> <canswer> そして ` `(1362501715 . <answer-structure>) Emacs Lispの(すべてのLispと大差ないが、あなたは知っていると愛このデータ構造は、おそらく最も正確ツリーとして説明しているが、言語を考慮し、これを行うには良い方法があるかどうかはわからないまったく) 。明示的なconsはおそらく不要ですが、それは私の脳がそれをよりよく包み込むのに役立ちます。<csite>たとえば、が次のようになるだけだと確信しています (<epoch-time> <api-param> <cquestion> <cquestion> ...) 懸念事項: このような潜在的に巨大な構造にデータを保存すると、システムのパフォーマンスが低下しますか?無関係なデータを保存しないようにしたいのですが、できる限りのことは行いましたが、データセットはそもそも(通常の使用のために)それほど大きくはないと思います。(私はリストの先頭にある時間を使用して古いデータをカリングすることを計画しています;それぞれはその子から最終更新時間を継承し、ツリーから継承します。このカリングが行われるべき範囲:私は承知しました。) このようなデータの保存には、データを使用する必要があるものとパフォーマンス上のトレードオフがありますか?つまり、セットとリトリーブ操作はリストのサイズの影響を受けますか? より良い構造がどのように見えるかについて他に提案はありますか?

1
JSでコンピューターシステムを構築していますか?[閉まっている]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 5年前休業。 私は最近、この本「The Elements of Computing Systems」を完成させました。基本的な論理ゲートから、独自の機械語コードとアセンブリ言語の作成、中間コード、そして最後に単純なオブジェクト指向に至るまで、ゼロから機能するコンピューターシステムを構築します。 VMコードにコンパイルするプログラミング言語。私はそれをたくさん楽しんだので、JavaScriptで同様の何かを作成したいと思いますが、より多くの機能を備えています。私はJSでハックマシン用のエミュレータをすでに書いています: // Creates a new CPU object that is responsible for processing instructions var CPU = function() { var D = 0; // D Register var A = 0; // A Register var PC = 0; // Program counter // Returns whether …
10 javascript 

4
Javaの主な焦点は何ですか?新機能を入手するのになぜこんなに時間がかかるのですか?
私は、ラムダ式、拡張メソッド、新しいストリームAPIなど、JDK8の新機能を調査しています。 明らかに、これらの機能のどれもプログラミングの世界で新しいものではないので、なぜ今までこれらすべての機能がJavaで利用されているのか不思議に思いました。 Lisp(1958)、SML(1973)、Haskell(1990)、Python(1991)、JavaScript(1994)、Ruby(1995)、Scala(2003)、C#(2007)、およびLispの55年後にラムダ式があり、 Java(2013)では実質的に他のすべての人。 そして、私はSIC(1996)のストリームについて読みました。 なんで今なんだろう?証拠は、他の言語との競争が動機ではないことを示唆しています。 このリリースのJavaの優れた新機能はすべて、並列処理の実装の副産物にすぎないようです。ラムダは、並列アルゴリズムの記述を簡単にするためにあり、ラムダ式が必要とする変更などをサポートするためにそれらを必要とするため、拡張メソッドがあります。 したがって、私の質問は、このJavaの次のリリースのメイントピックが実際に並列処理であることを安全に確認できるでしょうか。それとも、今までJavaで本の中で最も古いトリックが登場した他の理由を正当化できるでしょうか。

2
Strategyパターンのコンテキストクラス
私は戦略パターンを理解しようとして自分自身に問いかけています。コンテキストクラスはなくてはならないのですか、それともパターンの目的を損なうことなく省略できますか? さまざまな種類のファイルを読み取るためになんらかのスイッチが必要であるという印象を受けましたが、何かをハックして後でリファクタリングを処理したくありませんでした(もちろん、コードは常にリファクタリングされる可能性がありますが、アイデアは:設計をできるだけスマートにするために...): ウィキメディアから撮影した画像 クライアントはストラテジーインターフェイスに直接委任できますか、それともコンテキストクラスについて理解できなかったことがありますか? interface Reader { // read information from file and fill data list field of Client readFile(); } class ExcelReader implements Reader{ /* */ } class PdfReader implements Reader{ /* */} class Client{ // strategic choice Reader r; // data list field List<Data> data; // Client Constructor …

3
大規模なコードベースの離れた部分の間にデータフローを追加しやすくすることはできますか?
大規模なシステムに変更を加えるとき、機能の一部が別の部分からデータを取得する必要があるという問題にしばしば直面しますが、それらは深く分岐した呼び出しツリーの異なる部分にあり、イベントリスナー、遅延呼び出しを経由している可能性があります。このようにして、簡単な変更ですばやく膨らませることができます。 Yossi Kreininのブログ投稿(http://www.yosefk.com/blog/i-want-a-struct-linker.html)からの引用: あなたはあなたがたくさん渡すいくつかの種類のデータ構造を持っています。すぐに、構造に関して最も価値のあるものは、それが保持するデータではありませんが、制御の毛のような流れを通してずっと利用できるという事実です。 グローバル変数は、コードを遠く離れたコードに「叫び」させる1つの古典的な方法ですが、問題があることがわかっています。動的スコープ変数はより制限された方法ですが、同様に問題があります。 この問題を解決することを目的としたプログラミング言語の研究はありますか?静的チェック、簡単な単体テスト、その他の機能を備えたまま、予期しないデータフローを大規模なコードベースに簡単に追加できますか?


2
LispとSchemeの型
ラケットにはタイプがあります。一見すると、Haskellのタイピングとほとんど同じように見えます。しかし、LispのCLOSはHaskellタイプがカバーするいくつかのスペースをカバーしていますか?非常に厳密なHaskell型とオブジェクト指向言語でのオブジェクトの作成は、漠然と似ています。私がHaskellのクールエイドを飲んだだけで、Lispの道を進むと、動的なタイピングのために頭がおかしくなります。

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