ソフトウェア工学

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

3
BSDの「非推奨条項」が良いアイデアである場合、なぜ人々はBSDよりMITライセンスを選ぶのですか?[閉まっている]
この質問と回答によると New BSDライセンスの「非推奨条項」の目的は何ですか? 不要な方法であなたの名前を使用する人々を防ぐために、MITよりもBSDライセンスを選ぶ方が賢明です。 その場合、なぜ人々はまだBSDライセンスよりもMITライセンスを選ぶのですか?

10
サードパーティのライブラリを使用する-常にラッパーを使用しますか?
私が携わっているほとんどのプロジェクトは、いくつかのオープンソースコンポーネントを使用しています。一般的な原則として、コードのすべてのコンポーネントをサードパーティのライブラリにバインドするのを常に避け、代わりにカプセル化ラッパーを経由して変更の痛みを避けるのは良い考えですか? 例として、ほとんどのPHPプロジェクトはlog4phpをロギングフレームワークとして直接使用します。つまり、\ Logger :: getLogger()を介してインスタンス化し、-> info()または-> warn()メソッドなどを使用します。ただし、何らかの点で優れた仮想ロギングフレームワークが表示される場合があります。現状では、log4phpメソッドシグネチャに密接に関連するすべてのプロジェクトは、新しいシグネチャに適合するために、数十箇所で変更する必要があります。これは明らかにコードベースに大きな影響を与え、変更は潜在的な問題です。 この種のシナリオから将来の新しいコードベースを保証するために、ロギング機能をカプセル化し、最小限の変更で将来のロギングの動作方法を変更するために、ロギング機能をカプセル化し、簡単にできるようにするラッパークラスをしばしば検討します(そして時々実装します) ; コードがラッパーを呼び出すと、ラッパーは呼び出しをロギングフレームワークdu jourに渡します。 他のライブラリにはもっと複雑な例があることを念頭に置いて、私は過剰に設計しているのですか、それともほとんどの場合賢明な予防策ですか? 編集:その他の考慮事項-依存性注入とテストダブルを使用するには、とにかくほとんどのAPIを抽象化する必要があります(「コードの実行を確認し、その状態を更新しますが、ログコメントの書き込み/実際のデータベースへのアクセスはしません」)。これは決定者ではありませんか?

6
C#でFluentを使用するタイミング
多くの点で、Fluentインターフェイスのアイデアは本当に好きですが、C#の最新の機能(初期化子、ラムダ、名前付きパラメーター)のすべてで、「それだけの価値はありますか?」、「これは正しいパターンですか?」つかいます?"。Fluentパターンをいつ使用するかについて、少なくとも自分の経験や意思決定マトリックスを受け入れてもらえますか? 結論: これまでの回答からのいくつかの良い経験則: 呼び出しはコンテキストパススルーの恩恵を受けるため、Fluentインターフェイスはセッターよりもアクションが多い場合に非常に役立ちます。 流Fluなインターフェイスは、唯一の使用方法ではなく、APIの上のレイヤーと考える必要があります。 ラムダ、初期化子、名前付きパラメーターなどの最新の機能は、連携して動作し、流canなインターフェイスをさらに使いやすくします。 必要性を感じさせないモダンな機能の意味の例を次に示します。たとえば、次のような従業員を作成できる(おそらく悪い例の)Fluentインターフェイスを考えてみましょう。 Employees.CreateNew().WithFirstName("Peter") .WithLastName("Gibbons") .WithManager() .WithFirstName("Bill") .WithLastName("Lumbergh") .WithTitle("Manager") .WithDepartment("Y2K"); 次のような初期化子で簡単に記述できます。 Employees.Add(new Employee() { FirstName = "Peter", LastName = "Gibbons", Manager = new Employee() { FirstName = "Bill", LastName = "Lumbergh", Title = "Manager", Department = "Y2K" } }); この例のコンストラクターで名前付きパラメーターを使用することもできます。
78 c#  .net 

30
優れたプログラマーになるためには、数学が得意でなければなりませんか?[閉まっている]
優れたプログラマーも数学が得意であるという従来の知恵が示唆しているようです。または、2つが本質的にリンクされていること。私が読んだ多くのプログラミングの本は、数学の問題の解決策であるか、または数学に何らかの形で関連している多くの例を提供します。 ですから、私が浮かせたいのは、優れたプログラマーになるためには数学が得意である必要がありますか?
78 math 

17
コーディングガイドライン:メソッドには7つ以上のステートメントを含めないでください。
私はC#のAvSolコーディングガイドラインに目を通し、ほぼすべてに同意しましたが、特定のルールについて他の人がどう考えているかを知りたいと思います。 AV1500 メソッドは7つのステートメントを超えてはなりません。7つを超えるステートメントを必要とするメソッドは、処理が多すぎるか、責任が多すぎます。また、人間の心が正確なステートメントを分析して、コードが何をしているかを理解する必要があります。わかりやすい名前で、複数の小さくて焦点を絞った方法に分けてください。 あなたのほとんどはこのルールに従っていますか?読みやすさを大幅に向上させることは別として、新しいメソッドを作成すること(コードはまだDRYです)から節約できることはほとんどありませんか?そして、あなたの番号はまだ7と低いですか?私はもっ​​と10に向かう傾向があるでしょう。 私はあちこちでこの規則に違反していると言っているわけではありません。反対に、私の方法は95%小さくて集中していますが、この規則に違反してはいけないと言って本当に衝撃を受けました。 私は本当に誰もがこの規則に違反しないと思うことを知りたいだけです(コーディング標準の「1」です-これを絶対にしないでください)。しかし、そうでないコードベースを見つけるのに苦労すると思います。

11
Javaオブジェクトが参照されなくなった直後に削除されないのはなぜですか?
Javaでは、オブジェクトに参照がなくなるとすぐに削除の対象になりますが、JVMはオブジェクトが実際に削除されるタイミングを決定します。Objective-Cの用語を使用する場合、すべてのJava参照は本質的に「強力」です。ただし、Objective-Cでは、オブジェクトに強参照がなくなった場合、オブジェクトはすぐに削除されます。なぜこれがJavaに当てはまらないのですか?

12
JSONデータではなくHTMLを返すエンドポイントの実際の問題は何ですか?
PHPの学習を始めたとき(約5〜6年前)、Ajaxについて学び、「フェーズ」を経ました。 サーバーはHTMLデータを返し、DOMの innerHTML 内に配置します XMLなどのデータ転送形式について学習し(「ああ、そういうことです」と言ってから)、JSONを学びます。 JSONを返し、バニラJavaScriptコードを使用してUIを構築します jQueryに移動します API、ヘッダー、HTTPステータスコード、REST、CORS、およびBootstrapについて学ぶ SPA、およびフロントエンドフレームワーク(React、Vue.js、およびAngularJS)およびJSON API標準を学びます。 いくつかのエンタープライズレガシーコードを受け取り、検査すると、ステップ1で説明されていることを実行していることがわかります。 このレガシコードベースで作業していたので、HTMLを返すことができるとは考えていませんでした(つまり、私たちは今、プロですよね?)。そのため、 Ajax呼び出しが生成されます。「プログラマー」に尋ねたとき、彼はHTMLを返し、innerHTMLでDOMに直接追加されると言った。 もちろん、これは受け入れがたいものでした。これをJSONエンドポイントにリファクタリングする方法を考え始め、エンドポイントの単体テストなどを考え始めました。ただし、このコードベースにはテストがありません。単一ではありません。そして、それは20万行以上です。もちろん、私のタスクの1つには、すべてをテストするためのアプローチの提案が含まれますが、現時点ではまだ取り組んでいません。 だから私はどこにも、不思議に思っています:テストがまったくないのであれば、このJSONエンドポイントを作成する特別な理由はありません(「再利用可能」ではないため、文字通り、アプリケーションですが、HTMLデータを返すため、これはすでに暗示されていると思います)。 これを行うことで正確に何が間違っていますか?
77 design  ajax 

6
すべてのマジックナンバーは同じですか?
最近のプロジェクトでは、バイトからキロバイト kibibyteに変換する必要がありました。コードは簡単でした: var kBval = byteVal / 1024; それを書いた後、私は機能の残りを動かして、先へ進みました。 しかし、後になって、コードにマジックナンバーを埋め込んだのではないかと思い始めました。私の一部は、数が固定された定数であり、容易に理解されるべきだから、それは大丈夫だと言います。しかし、私の別の部分は、のような定義済み定数にラップされている場合、それは非常に明確だったと思いBYTES_PER_KBYTEます。 それで、よく知られた定数である数字は本当に魔法のようなものですか? 関連する質問: 数字はいつ魔法の数字ですか?そして、コード内のすべての数字は「マジックナンバー」と見なされますか?-似ていますが、私が尋ねているものよりもはるかに広範な質問です。私の質問は、よく知られている定数に焦点を当てていますが、これらの質問では取り上げていません。 マジックナンバーの削除:「いいえ」と言うタイミングはいつですか?も関連していますが、定数がマジックナンバーであるかどうかではなく、リファクタリングに焦点を当てています。

7
コードファーストとデータベースファースト
作業するソフトウェアを設計および作成するとき、通常、最初にバックエンドSQLテーブルを設計および作成してから、実際のプログラミングに進みます。私が現在取り組んでいるプロジェクトは、私を困惑させます。これはおそらく、適切で堅実な要件が不足しているためですが、残念ながら今度はそれについてできることはほとんどありません。それは「それを実現させるだけ」のような状況です。しかし、私は脱線します。 ワークフローを頭に入れ、最初にUIクラスとデータモデルクラスを作成して、データベーススキーマが最終的にどのように見えるかを明確にすることを考えています。これはいい考えですか?私はUIになり、dbをどのように構成するのかまだわかりません。 好奇心anyone盛な方は、SQL Serverをバックエンドとして、MS Accessをフロントエンドアプリケーションとして使用しています。(アクセスも私の選択ではありません...だから、あまりにも嫌いにしないでください。)

7
アーリーバインディングとレイトバインディングは何ですか?
アーリーバインディングとレイトバインディングについてよく耳にしますが、それらが何であるかはわかりません。私は理解できない次の説明を見つけました: アーリーバインディングとは、設計時に変数に値を割り当てることを指し、レイトバインディングとは、実行時に変数に値を割り当てることを指します。 誰かが2つのタイプのバインディングを定義して比較できますか?

11
テスト目的でコードを厳密に変更するのは悪い習慣ですか?
私はプログラマーの同僚と、テスト可能なものにするためだけに作業中のコードを変更するのが良いか悪いかについて議論しています(例えば、単体テストを介して)。 私の意見では、オブジェクト指向とソフトウェアエンジニアリングの優れた実践を維持することの範囲内で(「すべてを公開する」などではなく)OKです。 私の同僚の意見は、テスト目的でのみコードを修正するのは間違っているというものです。 単純な例として、一部のコンポーネント(C#で記述された)で使用される次のコードを考えてください。 public void DoSomethingOnAllTypes() { var types = Assembly.GetExecutingAssembly().GetTypes(); foreach (var currentType in types) { // do something with this type (e.g: read it's attributes, process, etc). } } 私は、このコードを修正して、実際の作業を行う別のメソッドを呼び出すことを提案しました。 public void DoSomething(Assembly asm) { // not relying on Assembly.GetExecutingAssembly() anymore... } このメソッドは、作業するAssemblyオブジェクトを取り込んで、テストを実行するために独自のAssemblyを渡すことを可能にします。私の同僚は、これが良い習慣だとは思いませんでした。 良い一般的な慣行とは何ですか?

10
C配列が長さを追跡しないのはなぜですか?
配列で配列の長さを明示的に格納しない背後にある理由は何Cですか? 私の考えでは、そうするのには圧倒的な理由がありますが、標準(C89)を支持する多くの理由はありません。例えば: バッファで利用可能な長さがあると、バッファのオーバーランを防ぐことができます。 Javaスタイルarr.lengthは明確であり、プログラマーintが複数の配列を扱う場合にスタックで多くのs を維持する必要がないようにします。 関数パラメーターはより適切になります。 しかし、おそらく私の考えでは、最もやる気の理由は、通常、長さを維持しないとスペースが節約されないからです。配列のほとんどの使用には動的割り当てが含まれると言って思います。確かに、人々はスタックに割り当てられた配列を使用する場合がありますが、それはたった1つの関数呼び出し*です-スタックは4または8バイト余分に処理できます。 ヒープマネージャーは、動的に割り当てられた配列によって使用される空きブロックサイズを追跡する必要があるため、その情報を使用可能にします(そして、コンパイル時にチェックされる追加のルールを追加します。足で自分を撃つのが好きです)。 私が反対側で考えることができる唯一のことは、長さの追跡がコンパイラをより単純にしたわけではないかもしれないが、それほど単純ではないということです。 *技術的には、自動ストレージを備えた配列を使用して、ある種の再帰関数を作成できます。この(非常に精巧な)場合、長さを格納すると、実際にはより多くのスペースが使用されます。
77 c 

11
ソフトウェアOS固有の理由
特定のオペレーティングシステム用のプログラミング言語を使用して作成されたソフトウェアがそれらでのみ動作する理由の技術的な詳細を判断しようとしています。 バイナリは特定のプロセッサに固有であり、理解しているプロセッサ固有のマシン言語と、異なるプロセッサ間で異なる命令セットがあるため、バイナリは特定のプロセッサに固有であることを理解しています。しかし、オペレーティングシステムの特異性はどこから来るのでしょうか?以前はOSが提供するAPIであると想定していましたが、次の本でこの図を見ました。 オペレーティングシステム-内部構造と設計原則7th ed-W. Stallings(Pearson、2012) ご覧のとおり、APIはオペレーティングシステムの一部として示されていません。 たとえば、次のコードを使用してCで簡単なプログラムを作成する場合: #include<stdio.h> main() { printf("Hello World"); } コンパイラはこれをコンパイルするときにOS固有のことを何ですか?

11
力を失うことなく読みやすい正規表現はありますか?
多くのプログラマーは、最近ではWebサービスの助けを借りて、またはより伝統的に対話型プロンプトで、または開発中の正規表現とテストケースのコレクションを持つ小さなスクリプトを書くことで、簡単な正規表現を作成する喜びを知っています。いずれの場合も、プロセスは反復的でかなり迅速です。必要なものが一致してキャプチャされ、不要なものが拒否されるまで、暗号のような文字列をハッキングし続けます。 単純な場合、結果はJava正規表現として次のようになります。 Pattern re = Pattern.compile( "^\\s*(?:(?:([\\d]+)\\s*:\\s*)?(?:([\\d]+)\\s*:\\s*))?([\\d]+)(?:\\s*[.,]\\s*([0-9]+))?\\s*$" ); また、多くのプログラマーは、正規表現を編集したり、レガシーコードベースの正規表現をコード化するだけで苦労することも知っています。それを分割するために少し編集すると、上記の正規表現は正規表現にかなり精通している人にとってはまだ非常に簡単に理解でき、正規表現のベテランはそれが何をするかすぐに見るべきです(誰かが運動をしたい場合には、投稿の最後に答えて自分自身でそれを理解する)。 しかし、正規表現が真に書き込み専用になるために物事はそれほど複雑になる必要はなく、勤勉な文書(もちろん誰もが書いているすべての複雑な正規表現についてもそうです)でさえ、正規表現の修正は困難な仕事。正規表現を慎重に単体テストしないと、非常に危険な作業になる可能性があります(ただし、もちろん、すべての複雑な正規表現(ポジティブとネガティブの両方)に対する包括的な単体テストがあります...)。 それで、長い話を簡単に言えば、正規表現の力を失うことなく、書き込み/読み取りソリューション/代替がありますか?上記の正規表現は、代替アプローチではどのようになりますか?どんな言語でも構いませんが、多言語ソリューションが最適ですが、正規表現は多言語です。 そして、以前の正規表現が行うことはこれです:formatの数字の文字列を解析し、1:2:3.4各数字をキャプチャします。スペースが許可され、3必要な場合のみです。


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