ソフトウェア工学

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

11
基本クラスと同じファイルでインターフェイスを宣言するのは良い習慣ですか?
交換可能かつテスト可能であるためには、通常、ロジックを備えたサービスにインターフェースが必要です。 public class FooService: IFooService { ... } 設計面ではこれに同意しますが、このアプローチで気になる点の1つは、1つのサービスに対して2つのもの(クラスとインターフェース)を宣言する必要があり、チームでは通常2つのファイル(1つクラス用とインターフェイス用)。IDE(VS2010)で[定義に移動]を使用すると、実際のクラスではなくインターフェイス(他のクラスがインターフェイスを参照するため)を指すため、ナビゲーションの難しさがもう1つあります。 FooServiceと同じファイルにIFooServiceを記述すると、上記の奇妙さが軽減されると考えていました。結局、IFooServiceとFooServiceは非常に関連しています。これは良い習慣ですか?IFooServiceを独自のファイルに配置する必要がある正当な理由はありますか?

12
クラスが「抽象」または「最終/封印」以外のものである必要があるのはなぜですか?
10年以上のjava / c#プログラミングの後、次のいずれかを作成しています。 抽象クラス:そのままインスタンス化されることを意図していないコントラクト。 final / sealedクラス:実装は、他の何かの基本クラスとして機能することを意図していません。 単純な「クラス」(つまり、抽象的でもファイナル/シールドでもない)が「賢明なプログラミング」になる状況は考えられません。 クラスが「抽象」または「最終/封印」以外のものである必要があるのはなぜですか? 編集 このすばらしい記事は、私の懸念を、私ができる以上によく説明しています。

3
オープンソースプロジェクトを「引き継ぐ」方法は?
私が興味を持ち、定期的に使用しているオープンソースプロジェクトがあります。これは、Apache License 2.0の下でライセンスされており、基本的にはもはやアクティビティがありません。Google Codeでホストされており、開発を継続することに興味があります。私はオープンソースプロセスに慣れていないので、これについて適切な方法を見つけようとしています。それをチェックアウトしてgithubにプッシュするだけで、そこでオープンに開発を続けることができますか?最初にプロジェクトの「所有者」に連絡する必要がありますか?また、変更を加えようとしている場合でも、著者情報をすべてクラスの上部などに残しますか?(答えはイエスだと仮定しています)? また、「すべての修正は修正者の作業であると明確にマークされている」というライセンス要件を実際にどのように遵守しますか?変更するたびにコメントを付けますか? ここでの通常のコース/標準についてのガイダンスは大歓迎です?

9
インターフェースの命名:接頭辞「Can-」と接尾辞「-Able」
インターフェイスのサフィックスとして「-able」を使用するのが一般的です Serializable Printable Enumerable Drinkable Shootable Rotatable 「Can-」の方がわかりやすいので、もっと良いかもしれないと考えていました。はい、より冗長であり、インターフェイス名にノイズを追加します。特に、受動動詞を使用できます。 例えば、Shootableは、オブジェクトが射撃できることを意味します(銃がこれを実装する場合があります)、または射撃できることを意味します(ターゲットボードがこれを実装する場合があります)。「Can-」プレフィックスを使用すると、前者は「CanShoot」になり、後者は「CanBeShotAt」または「CanShootAt」になります。 例2ドキュメント「CanBePrinted」とプリンター「CanPrint」 または、「-Able」に固執し、ドキュメントにコンテキストを提供させますか? ご意見。
29 api  interfaces 

10
使用しているコードが古いコーディングスタイルを使用しているため、プログラミングできません。これはプログラマにとって普通ですか?
プログラマーとしての最初の本当の仕事はありますが、コーディングスタイルが使用されているため、問題を解決できません。ここのコード: コメントはありません 機能がない(50、100、200、300以上の行が順番に実行される) if多数のパスを持つ多数のステートメントを使用します 意味をなさないの変数を持っている(例えば:cf_cfop、CF_Natop、lnom、r_procod) 古い言語(2002年のVisual FoxPro 8)を使用しますが、2007年から新しいリリースがあります。 1970年に戻ったような気がします。OOP、クリーンコード、デザインパターンなどに精通したプログラマーが、この昔ながらの方法でコーディングに問題を抱えることは普通ですか? 編集:すべての答えは非常に良いです。私の(未)希望として、この種のコードベースは世界中にたくさんあるように見えます。すべての答えに言及されているポイントは、コードのリファクタリングです。ええ、本当にやりたいです。私の個人的なプロジェクトでは、常にこれを行いますが、...コードをリファクタリングすることはできません。プログラマーは、設計されたタスク内のファイルのみを変更できます。 古いコードのすべての変更は、コードにコメントを付けておく必要があります(バージョン管理としてSubversionを使用する場合も含む)。さらに、その変更に関連するメタ情報(日付、プログラマー、タスク)古い行はコメントされました)。これはコードの問題だけでなく、ソフトウェア開発の管理の問題でもあると考えています。

8
CIツールでプロセスを実行するのは合理的ですか?
私の会社では、さまざまなcronジョブ(複数のシステム上)の泥沼があり、長年の適切な開発とその後の怠慢の結果として、ビジネスを機能させるプロセスを手動で開始しています。 いつか、明らかな理由から、より集中化されたソリューションを考え出す必要があります。 私たちが蹴っているのは、継続的インテグレーションソフトウェア(Jenkins)を使用してこれらのプロセスを実行することです。 私の質問は、他の企業がこれを行っているのですか?これは一般的に受け入れられている慣行ですか?これは、名前に暗黙的に含まれるCIツールの定義と矛盾しませんか?他のオプションはありますか? 注:https : //wiki.jenkins-ci.org/display/JENKINS/Meet+Jenkins Jenkinsは、「cronジョブやprocmailジョブなどの外部で実行されるジョブの実行の監視」に焦点を当てていると主張しています。これがまさに私が話していることであるかどうかはわかりません。

7
職場で個人コードを使用することは倫理的ですか?
私は仕事でサイドプロジェクトに取り組んでいます。そこでは、個人的に(仕事以外で)開発したコードの一部を使用して、開発を加速することが有益であると感じています。私のサイドプロジェクトは、C ++ GUIアプリケーションを開発して、パワーユーザーがいくつかの異なるプラットフォーム(DB2、Oracle、SQL Server、MySQL)のデータベースに対して(私が作成した)クエリを実行できるようにします。過去には、私は通常、要求に応じてこれらを自分で実行するか、それらのためにExcel VBAアプリケーションを構築していました。複数の異なる人々のために複数のVBAアプリケーションを作成したので、カスタム.sqlファイルを読み込んでさまざまなデータベースに対して実行する1つの中央アプリケーションを作成する必要があります。 私が作成しているアプリケーションはC ++であり、LGPLクロスプラットフォームGUIツールキットを使用しています。ただし、仕事以外のレジャープロジェクトで長年にわたって構築してきた多くのコードが自分のライブラリにあります。このコードを職場で使用しても大丈夫ですか?その場合、バグ修正や機能強化を個人用ライブラリに移植できますか?いつ通過するかわからない線があるようです。 個人的なコードはビジネスロジックとは何の関係もありません。これらは、基本的なユーティリティクラス/ラッパーです。

6
単体テストの期待される結果はハードコーディングされるべきですか?
単体テストの期待される結果をハードコーディングする必要がありますか、それとも初期化された変数に依存できますか?ハードコードまたは計算された結果は、単体テストでエラーを導入するリスクを高めますか?私が考慮していない他の要因はありますか? たとえば、これら2つのうち、どちらがより信頼性の高い形式ですか? [TestMethod] public void GetPath_Hardcoded() { MyClass target = new MyClass("fields", "that later", "determine", "a folder"); string expected = "C:\\Output Folder\\fields\\that later\\determine\\a folder"; string actual = target.GetPath(); Assert.AreEqual(expected, actual, "GetPath should return a full directory path based on its fields."); } [TestMethod] public void GetPath_Softcoded() { MyClass target = …
29 c#  unit-testing 


7
非リアルタイムWebアプリのnode.jsを避ける正当な理由はありますか?
Node.jsがリアルタイムWebアプリにどれほど優れているか、ソケット、Comet、AJAXの重い通信などを必要とするものについて、多くの話を見てきました。イベント駆動、非同期、スレッド駆動のモデルは、オーバーヘッドの少ない同時実行にも適していることを知っています。 また、Node.jsのチュートリアルでは、より単純で「伝統的な」非リアルタイムアプリ(たとえば、アプリ開発を学ぶ人にとって標準的な「Hello World」と思われる標準的なブログの例)を見ました。また、node-staticを使用すると、静的アセットを提供できることも知っています。 私の質問は次のとおりです。クラシファイド、フォーラム、前述のブログの例、または社内ビジネスアプリケーション用に作成するCRUDアプリなど、従来のWebアプリでNode.jsを使用しない理由はありますか。ファンキーなリアルタイムのものに優れているからといって、より安定した使用を禁じているのでしょうか? 私が考えることができるのは、最初のうちは、成熟したライブラリの不足です(ただし、変化しています)。 (私が求めている理由は、ほとんどの言語の切り替えのインピーダンス不整合を乗り越えるために、私はNode.jsのためにPHPを捨てる検討しているということですが、また、私は検証コードやその他もろもろを再利用することができるように。私の超自我のために私を訓戒選びます仕事に最適なツールですが、包括的な兵器庫を得るために15の言語とそのすべてのユーザーランドライブラリを学ぶ時間はあまりありません。また、Node.jsがPHP /将来的には、大量のトラフィックについて考え始めなければならないApache。 [編集]これまでの回答に感謝します。答えを選択する前に、他の誰かが体重を測定するかどうかを見たいだけです。@Raynosからの回答は私が考えていることを確認し、コメンターからのリンクは思考のための良い食べ物を提供しましたが、「ノードXを問題に使用しないでください」など、ノード固有の回答があるかどうかを確認したいです'。(CPUの高いタスクに加えて、私はすでにそれを知っています:-)

3
Entity Framework Code Firstは、本番環境では少し意味がありません/役に立たないのですか?
私は最近Entity Framework 4.1 Code Firstでプログラミングをしており、開発にそれを愛していますが、最終計画と急速に変化する機能リストだけで、アプリケーションのニーズに合わせてクラス/データベースを常に変更しています。 開発では、ライブデータはなく、データベース全体を簡単に削除できるので、新しいスキーマで再作成されますが、ライブ時には明らかに、これは非常に悪いです! 私が見ることができる唯一の解決策は、メタデータテーブルを削除して手動でデータベースの同期を維持するか、基本的に削除して再シードすることです。 個人的には、データを再作成して移行するよりも列/テーブルを追加する方がはるかに簡単だと思うため、最初の方法を好みますが、何かを見逃していない限り、これはCode Firstから完全に離れています。 質問は本当に、最初の開発についてのCode Firstだけであり、実稼働環境でEFを管理するための優れた戦略は何ですか?

10
設計上の「バグ」は悪い兆候ですか?
ユーザーが設計上のものについてバグレポートを提出するのは悪い兆候ですか それは通常、アプリケーションが混乱したり不明瞭であることを意味しますか、それとも特に明記しない限り、1回限りのユーザーの間違いまでそれをチョークする必要がありますか? (実際にはそのような報告はありません。これは、設計上の「バグ」の存在が悪いことであるかどうかについての純粋に仮説的な質問です。)
29 bug  users 

14
リッチコードの書式設定が一般的ではないのはなぜですか?
私はCode Completeを読んでいて、レイアウトとスタイルの章で、彼はコードエディターが何らかのリッチテキスト形式を使用すると予測していました。つまり、このようなコードの代わりに Procedure ResolveCollisions { Performs a posteriori collision resolution through spatial partitioning algoritm } ( CurrentMap : SpriteContext, PotentialColliders: SpriteList ) var Collider : Sprite, Collidee : Sprite, Collision : SpriteCollision begin DoStuff(); end. 次のようになります。 手順 ResolveCollisions 空間分割アルゴリズムにより事後衝突解決を実行します パラメーター CurrentMap : SpriteContext PotentialColliders : SpriteList ローカル変数 Collider : Sprite …

12
なぜfloat / doubleが必要なのですか?
私はhttp://www.joelonsoftware.com/items/2011/06/27.htmlを見ていて、0.3ではなく0.3についてのJon Skeetのジョークを笑っていました。個人的には浮動小数点数/小数/倍数の問題は一度もありませんでしたが、6502を非常に早く学習し、ほとんどのプログラムで浮動小数点数を必要としなかったことを覚えています。私がそれを使用したのは、不正確な数値は問題なく、出力は画面用であり、(db、ファイルに)格納または依存されないグラフィックと数学のためだけでした。 私の質問は、あなたが通常どこでfloats / decimals / doubleを使用しているのですか?だから私はこれらの落とし穴に注意することを知っています。お金ではlongを使用し、セント単位で値を保存します。ゲーム内のオブジェクトの速度のために、intを追加し、ピクセルを移動する必要があるかどうかを知るために値を分割(またはビットシフト)します。(6502日でオブジェクトを移動しました。分割もフロートもありませんが、シフトがありました)。 だから私はほとんど興味がありました。

4
単体テスト初心者向けの単体テストのベストプラクティス
近年、私は大規模なプロジェクトや小さなツールの人々のために小さなコンポーネントのみを作成しました。私はユニットテストを書いたことがなく、常にそれらの書き方を学び、実際にユニットテストを作成するのは、単にプログラムを起動して実際にテストするよりもはるかに時間がかかります。 私はちょうど完了するのに数か月かかる可能性があるかなり大規模なプロジェクトを開始しようとしていますが、(いつものように)書いているときに要素をテストしようとしていますが、ユニットテストで時間を節約できるかどうか疑問に思っています。 誰かが良いアドバイスをすることができるかどうか疑問に思っていました: プロジェクトの開始時に単体テストを検討し、TDDアプローチを採用する可能性があります。 各セクションが完了した後、テストを書くだけです。 プロジェクトを完了し、最後に単体テストを作成する必要があります。

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