ソフトウェア工学

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

14
型テストはいつ大丈夫ですか?
固有の型安全性を備えた言語(たとえばJavaScriptではない)を想定: を受け入れるメソッドを考えるSuperTypeと、ほとんどの場合、アクションを選択するために型テストを実行するように誘惑される可能性があることがわかります。 public void DoSomethingTo(SuperType o) { if (o isa SubTypeA) { o.doSomethingA() } else { o.doSomethingB(); } } 通常は、常にではありませんが、単一のオーバーライド可能なメソッドを作成し、SuperTypeこれを行う必要があります。 public void DoSomethingTo(SuperType o) { o.doSomething(); } ...ここで、各サブタイプには独自のdoSomething()実装が与えられます。アプリケーションの残りの部分は、与えられたものSuperTypeが実際にaであるSubTypeAかa であるかを適切に無視できますSubTypeB。 素晴らしい。 しかし、is aすべてではありませんが、ほとんどのタイプセーフ言語で-のような操作が与えられています。そして、それは明示的な型テストの潜在的な必要性を示唆しています。 だから、何で状況は、もしあれば、必要があります我々たりはしなければならない我々は、明示的な型のテストを実行しますか? 私の不在や創造性の欠如を許してください。私は前にそれをやったことを知っています。しかし、正直なところ、私がやったことが良いかどうか覚えていません!そして最近の記憶では、カウボーイJavaScriptの外部で型をテストする必要に遭遇したとは思いません。

5
nullではなくMaybe型の言語はエッジ条件をどのように処理しますか?
Eric Lippertは、C#が型nullではなくaを使用する理由についての彼の議論でMaybe<T>非常に興味深い点を述べました。 型システムの一貫性が重要です。null不可の参照が無効であると判断された状況下では決してないことを常に知ることができますか?参照型のnull不可フィールドを持つオブジェクトのコンストラクターではどうでしょうか?そのようなオブジェクトのファイナライザでは、参照を埋めるはずのコードが例外をスローしたためにオブジェクトがファイナライズされますが、どうでしょうか?その保証についてあなたに嘘をついている型システムは危険です。 それは少し驚くべきものでした。関連する概念に興味があり、コンパイラや型システムをいじくり回しましたが、そのシナリオについては考えませんでした。nullの代わりにMaybe型を持つ言語は、初期化やエラー回復など、想定される非null参照が実際には有効な状態にないエッジケースをどのように処理しますか?

16
シニアプログラマーは、常に本を使うことについてのアドバイスは良い考えですか?[閉まっている]
私はジュニア開発者であり、業界に5年間しかいません。私の現在の会社には上級者がいます。彼をInfestusと呼びましょう。ときどき、まったく新しいことを一からやり直す機会を与えられています。 最近の例の1つは、マルチスレッドアプリケーションでシングルトンを作成する必要があったことです。この方法を使用することにしました。Infestusがそれを見るとすぐに、彼はすぐに私を愚かだと呼び始め、このアプローチを使うように言った。なぜ彼がこれを改善したのかを尋ねたところ、これがJavaについてのこの本の方が優れていると言っているのです。 そして、それは一般的なパターンです:新しいことをする機会が得られるたびに、私はすぐにInfestusに打撃を受けます。彼の方法が優れている唯一の理由は、それらの本が有名なプログラマーによって書かれたからです。彼はいつも本を読んでくれて、どの方法を「学ぶ」かを考えています。 私は5年間だけお金のためにプログラミングをしてきましたが、問題を解決するための最良の方法について本を盲目的にたどることは常に良い考えですか、それとも時々実験してみるべきですか?Infestusからの苦情の絶え間ない弾幕により、私は決して新しいことを何も試みず、本の例に従うようになり始めています。 編集:私は完全に失われました。はい、盲目的に何かをフォローするのは悪い考えであることを知っています。しかし、この神のようなプログラマーであるInfestusは、適切にプログラムする唯一の方法は、本を読んでTにすべて従うことであると教えてくれます。本が唯一の正しい方法である場合。 EDIT2:Infestusは私の上司ではありません。彼はコードのレビューを担当する上級開発者の1人にすぎません。そして、レビュー後の彼のコメントの大部分は、そのような方法が間違っている本名で構成されています。

11
チームがすべてを社内で書くことはどのくらい一般的ですか?[閉まっている]
最近のインタビューで、私はインタビュアーに「新しいテクノロジーやライブラリ(SignalRなど)を評価し、それらを使用するためにどのように取り組みますか?」と尋ねました。彼らはそうではなく、代わりに自分ですべてを書くので、他の誰かに頼る必要がないと言った。 同社は政府や防衛請負業者、または安全重視のプロジェクトなどに従事していません。彼らはあなたの平均的な中規模のソフトウェア開発会社でした。 私の質問は、チームがすべてを自分で書くのはどれくらい一般的ですか?そうするチームに心配する必要がありますか? 編集-ほとんどすべての回答が、これは懸念事項であると述べています。二度目のインタビューは、家の中にすべてを書く際に自分の立場を明確にする/繰り返すように頼むのに適切な時間でしょうか?

9
主キーを公開しないのはなぜですか
私の教育では、実際のプライマリキー(DBキーだけでなく、すべてのプライマリアクセサー)をユーザーに公開することは欠陥のあるアイデアであると言われました。 私はいつもそれをセキュリティの問題だと思っていました(攻撃者が自分のものではないものを読もうとする可能性があるため)。 ユーザーがとにかくアクセスを許可されているかどうかを確認する必要があるので、その背後に別の理由がありますか? また、とにかくユーザーがデータにアクセスする必要があるため、その間のどこかに外部の公開キーが必要になります。公開キーには主キーと同じ問題がありますよね? とにかくそれを行う理由についての例の要求があったので、ここに1つがあります。質問は、この例に当てはまる場合だけでなく、原則自体に関するものであることを忘れないでください。他の状況に対処する回答は明示的に歓迎されます。 アクティビティを処理し、複数のUIとシステム間通信用の少なくとも1つの自動APIを備えたアプリケーション(Web、モバイル)アプリケーションには複数の顧客がいるため、データの分離(論理的には、データは同じDBに格納されます)はシステムに必要です。各リクエストは、どのような場合でも有効性がチェックされます。 アクティビティは非常に細かいので、いくつかのコンテナオブジェクトにまとめられ、「タスク」と呼びます。 3つのユースケース: ユーザーAは、ユーザーBを何らかのタスクに送りたいので、ユーザーBにリンク(HTTP)を送信して、そこでアクティビティを実行させます。 ユーザーBは建物の外に出て、モバイルデバイスでタスクを開く必要があります。 アカウンティングは顧客にタスクの料金を請求したいが、REST-アプリケーションのAPIを参照するコードによってタスク/アクティビティを自動的にロードするサードパーティの会計システムを使用する 各ユースケースでは、エージェントがタスクとアクティビティのアドレス可能な識別子を持っていることが必要です(または、より簡単になります)。

9
コードの一貫性とコードの改善の適切なバランスは何ですか?
最近、同僚とコードスタイルについて話し合いました。彼は、コードの外観(ブレースの配置、大文字の使用など)の場合と同じように、APIの使用法と使用している一般的なパターンは、コードベース全体ではなく、周囲のコードとできるだけ似ている必要があると主張していました。たとえば、C#でDAOクラスにメソッドを追加する場合、そのクラスの他のメソッドがそれを使用していない場合でも、コードをクリーンで維持しやすくするために、必要に応じてLINQを使用しようとします。しかし、私の同僚は、そのクラスの既存のスタイルに反するため、そのインスタンスでそれを使用すべきではないと主張し、したがって理解が難しくなります。 最初は私は彼の立場がかなり極端であると感じましたが、しばらく考え直した後、私は彼の主張を見始めています。架空のLINQの例では、同僚がLINQに慣れていないために、おそらくこのクラスには含まれていませんか?もしそうなら、もし私がそれを使わなかったなら、私の仲間の開発者にとって私のコードはより保守しやすいでしょうか?一方、このような手法を使用するとコードがよりきれいになると本当に信じている場合、周囲のコードと大幅に異なる場合でも使用すべきではありませんか? 私の同僚の議論の核心は、私たち全員が異なる方法でコードベースに同様の機能を実装しようとすると、私たちはそれぞれ私たちの方法が「最高」だと思うと、最終的にコード全体が難しくなることだと思う理解する。しかし、現時点では、既存のコードを盲目的にたどりすぎると、時間の経過とともに品質が徐々に低下していくと思います。 では、パターンはどの程度までコードスタイルの一部であり、一貫性を維持することと改善を行うことの間のどこに線を引くべきでしょうか。

9
クラスのメソッドは独自のゲッターとセッターを呼び出す必要がありますか?
私が働いている場所では、このようなことをするクラスがたくさんあります。 public class ClassThatCallsItsOwnGettersAndSetters { private String field; public String getField() { return field; } public void setField(String field) { this.field = field; } public void methodWithLogic() { setField("value"); //do stuff String localField = getField(); //do stuff with "localField" } } これを最初から書いた場合methodWithLogic()、代わりに次のように書いたでしょう。 public class ClassThatUsesItsOwnFields { private String field; public …

4
TDD-アウトサイドインとインサイドアウト
アプリケーションをOutside Inで構築することとTDDを使用してInside Outで構築することの違いは何ですか? これらはTDDとユニットテストについて読んだ本です: テスト駆動開発:例による テスト駆動開発:実用ガイド:実用ガイドMicrosoftでの 高品質PHPフレームワークとアプリケーションの開発のための実世界ソリューション NET xUnitテストパターン:テストコード のリファクタリングユニットテストの技術:.Net Growing Object-Oriented Softwareでの例、テストによるガイド ---> JAVAは私の主要言語ではないため、これを理解するのは非常に困難でした:) それらのほぼすべてがTDDの基本と単体テストを一般的に説明しましたが、アプリケーションを構築するさまざまな方法についてはほとんど言及しませんでした。 もう1つ気づいたのは、これらの書籍のほとんど(すべてではないにしても)が、アプリケーションの作成時に設計段階を無視していることです。彼らは、テストケースを迅速に記述し、設計を単独で出現させることに重点を置いています。 しかし、私は人々がTDDにアプローチする方法を議論したxUnitテストパターンのパラグラフに出会いました。Outside InとInside Outの 2つの学校があります。 悲しいことに、この本はこの点について詳しく説明していません。これら2つのケースの主な違いは何かを知りたいです。 それらのそれぞれをいつ使用する必要がありますか? 握りやすいTDD初心者には? 各方法の欠点は何ですか? このトピックを具体的に説明している資料はありますか?

7
バージョン管理の方法に何か問題がありますか?
私はプログラマーのチームとビジネスアナリストとして仕事をしています。製品のバージョン2.0をリリースしたばかりで、3か月後にリリースされる次のバージョンに取り組んでいます(内部ソフトウェア製品です)。残念ながら、バージョン2.0には修正が必要な問題がいくつかあり、数週間以内に修正を展開する予定です。問題は、まだ作業中であり、さらに3か月間リリースされる予定のない変更を展開したくないことです。 プログラマーは、これを管理する方法は、欠陥のコードのみをチェックインし、新しい拡張機能のコードは、完了するまで開発者のローカルマシンに保持することであると判断しました。テストのためにマシンからローカルビルドを取得する必要があります。彼らがコードをチェックインし、不具合を修正するために別のパッチをプッシュする必要がある場合、それらの機能強化をまだ含めたくないからです。また、同じコードファイルに不具合の修正と機能強化の両方が含まれるという問題もあるため、ローカルでコードファイルをコピーし、バグを修正するために変更を加えてバグをチェックし、その後、彼らが作ったローカルコピー。 かなり複雑に思えます-このタイプのシナリオを処理するより良い方法はありますか?Team Foundation ServerとVisual Studio 2010を使用しています。

1
Githubに参加する(プロジェクトの検索方法)[終了]
Githubのオープンソースプロジェクトに貢献したいと思います。ほとんどの場合、小さなバグの修正または機能の追加から始めたいと思います。特定のプロジェクトを考えていません。C、C ++、Python、.NET、Javaなどのプロジェクトに取り組みたい。しかし、私の問題は、Githubで何かを見つける方法がわからないことです。 Explore GithubでCプロジェクトをリストするページを見つけました。基本的に、上位5つの「監視された」Cプロジェクトをリストします。OK、それでいいのですが、5つ以上見たいです。 Sourceforgeは、プログラミング言語ごとにプロジェクトを閲覧できるため、優れていました。また、SourceForgeには、助けを求めているプロジェクトを見つけるためのフォーラムがあります。Githubでそれを見つけることができません。貢献するプロジェクトを見つけるのにかなり役に立たないように見える「検索」機能があります。高度な検索を試みて、プログラミング言語の「リポジトリ」と「C」に設定しました。しかし、あなたは彼が検索するものに何かを入れなければなりません。プロジェクトのタイトルと説明を参照したいだけです。 それで、何が起きるかを見るためだけに「ネットワーク」を置いてみました。存在するすべてのプロジェクトの全員の分岐点のリストのみを提供します。 適切な方法でプロジェクトを検索する方法はありますか?Githubにはそのようなものがあるはずです。Sourceforgeから検索できるので、Sourceforgeから選択しますが、Githubプロファイルを確立したいと思います。それは今月のフレーバーであり、GithubプロファイルはResumeよりも優れていると思うハッカーニュースにこれらのファンボーイがいるからです。 /履歴書。:)

6
誰が最初のループ構造のアイデアを作成しましたか?
while (1) { if (1+1==2) { print "Yes, you paid attention in Preschool!"; } else { print "Wait... I thought 1+1=2"; } } 開発者として、私たち全員が非常に頻繁にループを使用する必要があります。私達はことを知っています。私が疑問に思っていたのは、ループを持っているという考えを誰が考えたのですか?どの言語がループを導入しましたか?最初のループ構造は何でしたか?それはたwhileループ?forループ?等?
53 history  loops 

12
一歩下がって、新鮮な目でコードを見る方法は?[閉まっている]
私は昨年、1人のチームとしてリッチクライアントアプリケーション(35,000以上のLoC、価値あるもの)を開発しました。現在は安定しており、運用中です。しかし、プロジェクトの最初の段階では私のスキルが錆びていたことを知っているので、間違いなくコードに大きな問題があります。この時点で、ほとんどの問題はアーキテクチャ、構造、および相互作用にあります。簡単な問題は、アーキテクチャ/設計の問題でさえ、すでに取り除かれています。 残念ながら、私はこのプロジェクトに多くの時間を費やしているため、その外側を考えるのに苦労しています。新しい視点からアプローチして、設計に深く埋め込まれている、または固有の欠陥を確認します。 どうすれば頭の外やコードの外に出て、見た目を新しくしてより良くすることができますか?

2
C#で「void」がジェネリック型として許可されないのはなぜですか
void構築可能でなく、ジェネリック型として許可されないことを支持して設計上の決定は何でしたか?結局それだけで特別な空であるstructと明確な持つの合計PITA避けているだろうFuncし、Actionデリゲートを。 (C ++は明示的なvoid戻り値を許可voidし、テンプレートパラメータとして許可します)

5
なぜXHTML5ではないのですか?
だから、HTML5は大きな前進だと言われています。私が気づいた最後の一歩は、XHTMLの導入でした。利点は明白でした。単純さ、厳格さ、標準のXMLパーサーとジェネレーターを使用してWebページを操作できることなどです。 それでは、HTML5がそのすべてをロールバックするということは、どれほど奇妙でイライラするでしょう。ここでも、非標準の構文を使用しています。繰り返しになりますが、過去の荷物と解析の複雑さを処理する必要があります。繰り返しますが、標準のXMLライブラリ、パーサー、ジェネレーター、トランスフォーマーは使用できません。そして、W3Cが10年かけて正当な理由で推し進めたXMLによってもたらされたすべての利点(拡張性、名前空間、標準化など)は失われます。 XHTML5がありますが、HTML5エンコーディングのように人気が出ていないようです。たとえば、このSOの質問を参照してください。HTML5仕様でさえ、XHTML5ではなくHTML5が「ほとんどの著者に推奨される形式」であると述べています。 事実が間違っていますか?そうでなければ、なぜこのように感じるのは私だけですか?XHTML5ではなくHTML5を選択するのはなぜですか?
53 html  html5  xml  xhtml 

3
.NETでのログとトレースのベストプラクティス
私はトレースとログについて多くのことを読んでおり、問題のベストプラクティスの黄金律を見つけようとしましたが、何もありません。優れたプログラマーは優れたトレースを生成すると言いますが、それはそのように言えます。それは経験からもたらされなければなりません。 また、ここやインターネットで同様の質問を読んだことがありますが、質問が詳細を欠いているためか、私が尋ねているものと同じものではなく、満足のいく答えもありません。 そのため、デバッガーをアタッチできない場合、トレースはアプリケーションのデバッグの経験をある程度再現すべきだと人々は言います。アプリケーションの各コントロールポイントでどのパスが使用されているかを確認できるように、十分なコンテキストを提供する必要があります。 さらに詳しく説明すると、「イベントログは、詳細な制御フローではなく主要な状態をキャプチャするという点でトレースとは異なる」という点で、トレースとイベントログを区別することもできます。 ここで、System.Diagnostics名前空間にある標準の.NETクラスのみを使用して、トレースとロギングを実行したいとします。TraceSourceクラスは静的Traceクラスよりもジョブに適していると考えました。トレースレベルを区別し、TraceSourceクラスを使用すると、イベントタイプを通知するパラメータを渡すことができ、Traceクラスを使用する必要があるためです。Trace.WriteLineIfその後、のようなものを確認するSourceSwitch.TraceInformationとしSourceSwitch.TraceErrors、それはさえのような性質がないTraceVerboseかをTraceStart。 これらすべてを念頭に置いて、次のようにすることをお勧めします。 メソッドを開始するときに「開始」イベントをトレースします。これは、メソッドに渡されるパラメーター値のストリング表現とともに、単一の論理操作またはパイプラインを表す必要があります。 データベースにアイテムを挿入するときに「情報」イベントをトレースします。 重要なif / elseステートメントで1つのパスまたは別のパスを取るときに「情報」イベントをトレースします。 回復可能なエラーであるかどうかに応じて、catchブロックで「クリティカル」または「エラー」をトレースします。 メソッドの実行が終了したら、「停止」イベントをトレースします。 また、VerboseおよびWarningイベントタイプをトレースする最適なタイミングを明確にしてください。優れたトレース/ロギングを備えたコードの例があり、共有したい場合は、それが優れているでしょう。 注:ここでいくつかの良い情報を見つけましたが、探しているものはまだ見つかりません:http : //msdn.microsoft.com/en-us/magazine/ff714589.aspx
53 .net  logging 

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