ソフトウェア工学

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

2
ユニットテストの効率を最大化するには、C ++ユニットテストコードをどのように編成する必要がありますか?
この質問は、単体テストフレームワークに関するものではありません。 この質問は、単体テストの作成に関するものではありません。 この質問は約あるところ書かれたUTのコードを配置する方法と、/とき/コンパイルし、それを実行する場所。 レガシーコードを効果的に使用するにあたって、Michael Feathersは次のように主張しています。 優れた単体テスト...高速で実行 そしてそれ 実行に1/10秒かかる単体テストは、低速の単体テストです。 これらの定義は理にかなっていると思います。私はまた、ユニットテストのセットと、より長い時間がかかるコードテストのセットを別々に保持する必要があることを示唆していると思いますが、それが(非常に)高速に実行される場合、ユニットテストと呼ばれるものだけに支払う代償だと思います。 明らかに問題 ++ Cでは、「実行」へのあなたのユニットテスト(複数可)、あなたがする必要があります。 コードを編集します(使用している「サイクル」に応じて、本番またはユニットテスト) コンパイル リンク 単体テスト実行可能ファイルの開始(s) 編集(奇妙な近い投票の後):詳細に入る前に、ここでポイントを要約してみます: (テスト)コードの編集とテストコードの実行の両方が効率的になるように、C ++ユニットテストコードを効果的に編成するにはどうすればよいですか? 最初の問題は、その後、決定することですどこようにユニットテストコードを配置します: 関連する製品コードと組み合わせて編集および表示するのは「自然」です。 現在変更しているユニットのコンパイルサイクルを開始するのは簡単です。 次に、関連する2番目の問題は、フィードバックが瞬時に行われるようにコンパイルするものです。 極端なオプション: 各Unit-Test-Test-Unitは個別のcppファイルに存在し、このcppファイルは(テストするソースコードのユニットファイルと共に)個別にコンパイルおよびリンクされ、単一の実行可能ファイルにリンクされます。 (+)これにより、単一のテストユニットの起動(コンパイル+リンク!)時間を最小限に抑えることができます。 (+)テストは1つのユニットのみをテストするため、超高速で実行されます。 (-)スイート全体を実行するには、膨大な数のプロセスを開始する必要があります。管理することが問題になる場合があります。 (-)プロセス開始のオーバーヘッドが見えるようになる 反対側は、テストごとに1つのcppファイルを持っていますが、すべてのテストcppファイルは(テストするコードとともに)1つの実行可能ファイルにリンクされています(モジュールごと/プロジェクトごと/選択を選択してください)。 (+)変更されたコードのみがコンパイルされるため、コンパイル時間は問題ありません。 (+)実行するexeは1つしかないため、スイート全体の実行は簡単です。 (-)任意のオブジェクトを再コンパイルすると再リンクがトリガーされるため、スイートはリンクするのに時間がかかります。 (-)(?)スーツの実行には時間がかかりますが、すべてのユニットテストが高速であれば、時間は問題ないはずです。 それでは、実際のC ++ 単体テストはどのように処理されますか?夜間/毎時だけ実行する場合、2番目の部分は実際には重要ではありませんが、最初の部分、つまりUTコードを本番コードに「結合」する方法です。フォーカスは常に重要だと思います。(そして、開発者がUTコードに焦点を合わせている場合、彼らはそれを実行したいと思うので、パート2に戻ります。) 現実世界の物語と経験に感謝します! ノート: この質問は、意図しないプラットフォームとメイク/プロジェクトシステムを意図的に残します。 質問タグ付きUT&C ++は開始するのに最適な場所ですが、残念ながらあまりにも多くの質問、特に回答が詳細や特定のフレームワークに集中しすぎています。 少し前に、ブーストユニットテストの構造に関する同様の質問に答えました。この構造は、「実際の」高速な単体テストには欠けていることがわかりました。そして、私は他の質問が狭すぎると思うので、この新しい質問です。

5
リード開発者として成功するにはどうすればよいですか?[保留]
私は特定のプロジェクトの主任開発者になりましたが、全体像に焦点を当てて、プロジェクトのすべての部分をカバーするのに苦労しています。 このプロジェクトを管理するとき、私は何に留意すべきですか?すべてが必要な方法で処理されるようにするにはどうすればよいですか?

13
割り当て演算子が左側に割り当てられるのはなぜですか?
私はちょうど友達プログラミングを教え始めました(Pythonを使用しています)。変数の作成と代入演算子について議論し始めたとき、彼女はなぜ右の値が左の名前に割り当てられているのかを尋ねました。 。 私にとってそれは自然に思えたので、あまり考えたことはありませんでしたが、彼女は左から右の方が自然であると言った、それが私たちのほとんどが自然言語を読む方法だからです。 私はそれについて考えて、割り当てられた名前(プログラマが再利用する必要がある)が簡単に表示され、左に揃えられているため、コードがはるかに読みやすくなると結論付けました。 aligned = 2 on = 'foo' + 'bar' + 'foobar' the = 5.0 / 2 left = 2 + 5 とは対照的に: 2 = aligned 'foo' + 'bar' + 'foobar' = on 5.0 / 2 = the 2 + 5 = right # What were the names …

6
ライセンスを選択したら、変更できますか?
私は完全に準備ができているとは思わない製品に取り組んでいますが、現在「アルファ」テスターとしてそれを使用することに非常に興味を持っているユーザーのセットがあります。「アルファ」テスターとして今すぐ無料で製品を提供したいのですが、後でソフトウェアのライセンスを取得したいと思います。 これは可能ですか?誰でもリンク/本/記事/などを私に指すことができますか? ありがとう。 編集: 私の明快さの欠如と私はこの声明を追加すべきだと思った質問への応答のため。 このプロジェクトをクローズソースにするかオープンソースにするかはまだ決めていません。今、それを手に入れたいユーザーベースは私をちょっと驚かせて、オープンソースとして後でクローズドソースに変更して、それを彼らに与えることができる限り、私のオプションが何であるかを心配しました、またはその逆も。 答えてコメントしてくれたみんなに感謝します。洞察に感謝します。
47 licensing 

10
インラインスクリプトを避けるべき理由
最近、知識のある友人が私が立ち上げたウェブサイトを見て、「非常にクールなサイト、ソースコードのインラインスクリプトについての恥」などのコメントをしました。 私は間違いなく、インラインスクリプトが発生する場所を削除する立場にあります。私はそれが「悪いこと」であることを漠然と認識しています。私の質問は、インラインスクリプトの本当の問題は何ですか?重大なパフォーマンスの問題がありますか、それともほとんど良いスタイルの問題ですか?インラインスクリプティングの前線で即座にアクションを実行することを上司に正当化できますか?Webサイトにアクセスしてソースコードを覗いてみると、どのような要因が「うーん、ここでのプロフェッショナルな仕事」と言ってしまうでしょうか。 さて、その質問は執筆中に複数の質問に変わりました。しかし、基本的に、インラインスクリプティング-契約は何ですか?

9
アジャイル開発方法論の実行可能な代替手段はありますか?
2つの主要なソフトウェア開発方法論は、ウォーターフォールとアジャイルです。これら2つを議論するとき、それらを区別する特定のプラクティス(ペアプログラミング、TDDなどと機能仕様、大きな先行設計など)に多くの焦点が置かれることがよくあります。 しかし、実際の違いははるかに深く、これらの慣行は哲学に基づいているという点です。 Waterfall氏は次の ように述べています。 アジャイルは言う: 変化は避けられないので、変化を安くする。 私の質問は、TDDや機能仕様についてどう考えているかにかかわらず、ウォーターフォール開発の方法論は本当に実行可能かということです。 ソフトウェアの変更を最小限に抑えることは、貴重なソフトウェアを提供することを望む人々にとって実行可能なオプションであると本当に考えている人はいますか?それとも、避けられない変化を管理するために、私たちの状況でどのような実践が最も効果的に機能するのかという質問ですか?

9
テストファーストプログラミングの欠点は何ですか?
最近は大流行です。「みんな」がそれをお勧めします。それ自体が疑わしいものです。 テストファースト(テスト駆動)開発を行うときに発見したいくつかの欠点は何ですか?私は知識のある開業医からの個人的な経験を探しています。私はインターネット上の他の場所にある百人の夢想家の仮説を読むことができます。 TDDが嫌いだからではなく、ソフトウェア開発プロセスを改善することが私の仕事であり、人々が遭遇する問題について学ぶことができれば、プロセスを改善できる可能性が高くなるからです。

20
なぜ一見不均衡な量のプログラマーだけが、いい人じゃないのですか?[閉まっている]
たぶん個人的な経験かもしれませんが、私はさまざまなグループやタイプの人々と関わっており、私が遭遇したプログラマのかなりの割合が「良くない」か、より良い定義を試みているようです。 見下す ひどい 彼らは人々について話す方法で否定的 同じことに気づいた場合、その理由についての理論はありますか?これらのプログラマーの一人に彼らがどのように行動しているのかを丁寧にまたは丁寧に教えて、彼らが仕事をしたいと思うプロとして認識されたい場合は修正することを提案しますか? あるいは、私は悪いサンプルに出くわしただけで、名前を付けることができるすべての人々のグループに悪い種があります。
47 teamwork 

22
ソースコードをチェックインする前のいくつかの良い習慣は何ですか?[閉まっている]
私のチームはソース管理にTeam Foundation Serverを使用しています。今日、チェックインする前にいくつかのバグとスモークテストアプリケーションを修正しましたが、コードをコメントするのを忘れていました。(このコードにより、UIが少し奇妙になりました。) コードをチェックインする前に、どのような優れたプラクティスがあるのか​​を知りたい-この種の間違いを二度とやりたくない。

10
フラグ変数は絶対的な悪ですか?[閉まっている]
フラグ変数は悪ですか?次の種類の変数は非常に不道徳であり、それらを使用するのは邪悪ですか? 「特定の場所で値を割り当てた後でブール値または整数変数を下にチェックしてから、何かをするかどうかをチェックしてから、たとえばnewItem = true以下の行を使用するif (newItem ) then」 フラグの使用を完全に無視して、より良いアーキテクチャ/コードになったプロジェクトをいくつか行ったことを覚えています。しかし、それは私が働いている他のプロジェクトでは一般的な慣行であり、コードが大きくなりフラグが追加されると、IMHOコードスパゲッティも大きくなります。 フラグを使用するのが良い習慣である、あるいは必要な場合があると言いますか?またはコードでフラグを使用することは...赤いフラグであり、回避/リファクタリングする必要があることに同意しますか?私は、代わりにリアルタイムで状態をチェックする関数/メソッドを実行するだけでうまくいきます。

5
クラスに関係のない関数はどこに置くべきですか?
私はクラスの一部として使用するために最初に書いた数学関数の束があるC ++プロジェクトに取り組んでいます。もっとコードを書いているうちに、どこでもこれらの数学関数が必要だと気づきました。 それらを置くのに最適な場所はどこですか?私がこれを持っているとしましょう: class A{ public: int math_function1(int); ... } そして、私が別のクラスを書くとき、私はその他のクラスでそれを使用することはできません(または、少なくともその方法を知りません)math_function1。さらに、この関数の一部はクラスAに実際には関連していないことに気付きました。それらは最初のように見えましたが、今では数学関数であることがわかります。 この状況での良い習慣は何ですか?今、私はそれらを新しいクラスにコピー&ペーストしていますが、これは最悪のプラクティスだと確信しています。
47 c++  functions  class 

4
クラスを「静的」にする理由と時期 クラスの「静的」キーワードの目的は何ですか?
static多くの言語のメンバーのキーワードは、そのメンバーにアクセスできるようにするためにそのクラスのインスタンスを作成しないことを意味します。ただし、クラス全体を作成する理由はありませんstatic。なぜ、私はクラスを作る必要があるときstatic? クラスを作るとどんなメリットがありstaticますか?つまり、静的クラスを宣言した後も、インスタンス化せずにアクセスしたいすべてのメンバーを静的として宣言する必要があります。 これは、たとえば、Math開発者のコ​​ーディング方法に影響を与えることなく、クラスを(静的ではなく)通常と宣言できることを意味します。言い換えれば、クラスを静的または通常にすることは、開発者にとっては透過的です。

10
MVVMの使用はどのような条件下で適切ですか?
Model View View-Modelは、イベント駆動型プログラミング、特にXAMLおよび.NET言語を使用する.NETプラットフォーム上のWindows Presentation Foundation(WPF)およびSilverlightをサポートするUI開発プラットフォームをターゲットとしてMicrosoftによって開発されました。それ以来、Angular、Knockout、ExtJSなどの多くのJavascriptフレームワークがこのパターンを採用しています。 ほとんどのソフトウェアパターンと同様に、MVVMには適切な用途と悪用があります。MVVMの使用はどのような条件下で適切ですか?いつお勧めしませんか?

2
アラン・ケイは、Smalltalkの初期の歴史における「割り当て」とはどういう意味ですか?
私はSmalltalkの初期の歴史を読んでおり、その意味の理解に疑問を抱かせる「割り当て」についての言及がいくつかあります。 OOPは多くの動機から来ましたが、2つが中心でした。大規模なものは詳細の隠蔽を伴う複雑なシステムのためのより良いモジュールスキームを見つけることであり、小規模なものは割り当てのより柔軟なバージョンを見つけることであり、それからそれを完全に排除しようとしました。 (1960-66から-初期のOOPおよび60年代のその他の形成的アイデア、セクションI) Simulaから得たのは、バインディングと割り当てを目標に置き換えることができるということです。プログラマーに最後に望むことは、たとえ比fig的に提示されたとしても、内部状態を混乱させることです。代わりに、オブジェクトは、動的コンポーネントとしての使用により適した、より高いレベルの動作のサイトとして提示される必要があります。(...)残念なことに、今日「オブジェクト指向プログラミング」と呼ばれるものの多くが、より洗練された構成要素を備えた単純な古いスタイルのプログラミングである。多くのプログラムには、より高価な添付プロシージャによって実行される「割り当てスタイル」操作がロードされています。 (「オブジェクト指向」スタイル、セクションIVから) オブジェクトがファサードであり、オブジェクトにインスタンス変数を設定することを目的とするメソッド(または「メッセージ」)(つまり「割り当て」)が目的に反しているという意図を解釈するのは正しいですか?この解釈は、セクションIVの後半の2つのステートメントでサポートされているようです。 永続状態、ポリモーフィズム、インスタンス化、およびオブジェクトの目標としてのメソッドの4つの手法が一緒に使用され、多くの権限を占めています。これらのいずれも「オブジェクト指向言語」を採用する必要はありません--ALGOL 68はほとんどこのスタイルに変えることができます-そして、OOPLは単に特定の実りある方向にデザイナーの心を集中させます。ただし、カプセル化を正しく行うことは、状態の抽象化だけでなく、プログラミングから状態指向のメタファーを排除することを約束するものです。 ...そして: 割り当てステートメントは、抽象的なものであっても、非常に低いレベルの目標を表します。何かを成し遂げるためには、それらの多くが必要になります。一般に、シミュレートされているかどうかに関係なく、プログラマが状態をいじり回すことは望ましくありません。 ここでは、不透明で不変のインスタンスが推奨されていると言ってもいいでしょうか?または、推奨されていない単純な状態変更ですか?私が持っている場合たとえば、BankAccountクラスを、それが持ってOKだGetBalance、DepositとWithdrawインスタンスメソッド/メッセージ。SetBalanceインスタンスメソッド/メッセージがないことを確認してください?

4
有用な単体テストとは何かを決定する
私はphpunitのドキュメントを調べてきましたが、次の引用に出くわしました: いつでもテストを作成できます。ただし、想像できるテストのほんの一部だけが実際に有用であることがすぐにわかります。あなたがしたいのは、あなたがそれらがうまくいくと思っていても失敗するテスト、またはあなたはそれらが失敗すると思っても成功するテストを書くことです。それを考える別の方法は、費用/利益の観点からです。情報を返してくれるテストを書きたい。-エーリッヒガンマ 不思議に思いました。コスト/ベネフィットについての引用で述べられていることを別にして、ユニットテストが他のテストよりも有用である理由をどのように判断しますか 単体テストを作成するコードの部分をどのように決定しますか?それらの引用の別のものも言ったので、私はそれを求めています: それで、それがテストに関するものでない場合、それは何についてですか?それはあなたがそれをしようとするために半コックから逃げる前にあなたがしようとしていることを理解することです。動作の小さな側面を簡潔で明確で実行可能な形式で記述する仕様を作成します。とても簡単です。テストを書くということですか?いいえ。コードが何をする必要があるかについての仕様を記述することを意味します。コードの動作を事前に指定することを意味します。しかし、そう遠くはない。実際、コードを記述する直前が最適です。なぜなら、その時点までに必要なだけの情報が手元にあるからです。よくできたTDDと同様に、少しずつ作業を進めます。一度に1つの動作の小さな側面を指定し、それを実装します。すべてが動作を指定することであり、テストを作成することではないことに気付いたら、あなたの視点が変わります。突然、プロダクションクラスごとにテストクラスを持つという考えはとんでもなく制限されます。そして、各メソッドを独自のテストメソッド(1対1の関係)でテストするという考えは笑えるでしょう。-デイブ・アステルス その重要なセクションは * そして、各メソッドを(1-1の関係で)独自のテストメソッドでテストするという考えは、笑えるでしょう。* 各メソッドのテストを作成することが「笑える」場合、どのように/いつテストを書くかを選択しますか?

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