ソフトウェア工学

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

11
コンストラクターのみのサブクラス:これはアンチパターンですか?
私は同僚と議論をしていましたが、最終的にはサブクラス化の目的に関して直感が矛盾することになりました。私の直感では、サブクラスの主な機能がその親の限られた範囲の値を表現することであれば、おそらくサブクラスであってはならないということです。彼は反対の直観を主張しました:サブクラス化はオブジェクトがより「特定的」であることを表し、したがってサブクラス関係がより適切であるということです。 私の直感をより具体的に言うと、親クラスを拡張するサブクラスがあるが、サブクラスがオーバーライドする唯一のコードがコンストラクターである場合(そう、コンストラクターは一般に「オーバーライド」しないことを知っています。本当に必要だったのは、ヘルパーメソッドです。 たとえば、このやや現実的なクラスを考えてみましょう。 public class DataHelperBuilder { public string DatabaseEngine { get; set; } public string ConnectionString { get; set; } public DataHelperBuilder(string databaseEngine, string connectionString) { DatabaseEngine = databaseEngine; ConnectionString = connectionString; } // Other optional "DataHelper" configuration settings omitted public DataHelper CreateDataHelper() { Type dataHelperType = DatabaseEngineTypeHelper.GetType(DatabaseEngine); DataHelper …

6
言語のテストが構文レベルでサポートされている機能ではないのはなぜですか?
ソースコードの単体テストの利点を宣伝するブログ、記事、ウェブサイトの無限のリストを見つけることができます。Java、C ++、C#、およびその他の型付き言語用のコンパイラをプログラムした開発者は、ユニットテストを使用して作業を検証したことがほぼ保証されています。 それでは、なぜその人気にもかかわらず、これらの言語の構文にテストがないのでしょうか? マイクロソフトはC#にLINQを導入しましたが、なぜテストも追加できないのですか? 私は、これらの言語の変更がどうなるかを予測するつもりはありませんが、そもそもなぜそれらが変更されないのかを明確にするつもりです。 例として:ステートメントのfor構文なしでループを書くことができることを知っていますfor。whileまたはif/ gotoステートメントを使用できます。誰かがfor声明がより効率的であると判断し、それを言語に導入しました。 テストがプログラミング言語の同じ進化に従っていないのはなぜですか?

4
なぜマイクロソフト「Roslyn」に時間を費やすのでしょうか?
Microsoft "Roslyn"のホワイトペーパーと例のいくつかを読んでいるところですが、このコンセプトは非常に興味深いようです。私が知ることができることから、コンパイラであるブラックボックスを開き、Visual Studioで記述されたコードに関する情報とメトリックを取得するために使用できるインターフェイスを提供します。 Roslynには、コードを「スクリプト化」してオンザフライでコンパイル/実行する機能もあるようです(CodeDomに似ています)が、私の経験では、そのタイプの機能の使用は限られています。 コード分​​析とメトリック要素は興味深いスペースですが、それは非常に長い間存在しており、コード分析とリファクタリングツール(ReSharper、CodeRushなど)にすでに多くのお金を投資している多くのプロバイダーがあります、nCoverなど)、彼らはそれをかなりうまくやっています! 既存のツールのいずれかのライセンスを購入することで、わずかなコストで提供できるものを実装するために、なぜ会社が邪魔にならないのでしょうか? おそらく、言及されたツールのドメイン外に配置するRoslynプロジェクトの重要な機能をいくつか見落としていました...

6
型推論が役立つのはなぜですか?
私はコードを書くよりも頻繁にコードを読みますが、産業用ソフトウェアに取り組んでいるプログラマーのほとんどがこれを行うと仮定しています。型推論の利点は、冗長性が少なく、コードが少ないことです。しかし一方で、コードをより頻繁に読む場合は、おそらく読み取り可能なコードが必要になります。 コンパイラーは型を推測します。これには古いアルゴリズムがあります。しかし、本当の質問は、プログラマーがコードを読むときに変数のタイプを推測したいのはなぜですか?誰がタイプを読むだけで、どのタイプがあるかを考えるよりも速くないですか? 編集:結論として、なぜそれが役立つのかを理解しています。しかし、言語機能のカテゴリでは、演算子がオーバーロードしているバケツの中にあります-場合によっては便利ですが、乱用された場合は読みやすさに影響します。

4
静的クラスよりも非静的内部クラスを好むのはなぜですか?
この質問は、Javaでネストされたクラスを静的なネストされたクラスにするか、内部のネストされたクラスにするかです。私はこことStack Overflowを検索しましたが、この決定の設計への影響に関する質問は本当に見つかりませんでした。 私が見つけた質問は、静的なクラスと内部のネストされたクラスの違いについて尋ねていることです。ただし、Javaで静的にネストされたクラスを使用する説得力のある理由はまだ見つかりませんでした。匿名クラスを除き、この質問では考慮していません。 静的なネストされたクラスを使用した場合の影響についての私の理解は次のとおりです。 結合の減少:クラスは外部クラスの属性に直接アクセスできないため、一般的に結合が減少します。一般に、結合が少ないということは、コードの品質の向上、テストの容易化、リファクタリングなどを意味します。 シングルClass:クラスローダーは毎回新しいクラスを処理する必要はなく、外側のクラスのオブジェクトを作成します。同じクラスの新しいオブジェクトを何度も取得するだけです。 内部クラスの場合、一般に、人々は外部クラスの属性へのアクセスをプロと考えることがわかります。この直接アクセスは高いカップリングを意味し、ネストされたクラスを別のトップレベルクラスに抽出したい場合は、本質的に向きを変えた後にのみ行うことができるため、デザインの観点からこの点で異なるようにお願いします静的なネストされたクラスに入れます。 したがって、私の質問はこれに帰着します:非静的内部クラスに利用可能な属性アクセスが高い結合につながり、したがってコード品質が低下すると仮定するのは間違っていますか、これから(非匿名)ネストされたクラスが一般的に静的ですか? または言い換えると:ネストされた内部クラスを好む理由は納得できますか?


5
JavaScriptを(ブラウザで)ハッキングするのはどれくらい簡単ですか?
私の質問はJavaScriptのセキュリティに関するものです。 BackboneやAngularJSのようなJavaScriptフレームワークを使用し、安全なエンドポイントが必要な認証システムを想像してください。サーバーは常に最後の単語を持ち、あなたが望むことをする権限があるかどうかをチェックするので、それは問題ではありません。 しかし、サーバーを使用せずに少しのセキュリティが必要な場合はどうでしょうか?それは可能ですか? たとえば、クライアント側のルーティングシステムがあり、ログインしたユーザーに対して具体的なルートを保護したいとします。したがって、保護されたルートへのアクセスを許可されているかどうかを確認するためにサーバーにpingを実行します。問題は、サーバーにpingを送信すると、応答を変数に保存するため、次回プライベートルートにアクセスしたときに、既にログインしている(サーバーにpingを送信していない)かどうか、および応答でそれが行くかどうか。 ユーザーがその変数を変更してアクセスするのは簡単ですか? 私のセキュリティ(およびJavaScript)の知識はあまり良くありません。しかし、変数がグローバルスコープ内になく、ゲッターのみを持ちセッターを持たないモジュールパターンのプライベート部分にある場合、その場合でも、ハッキングできますか?

11
各クラスの責任が1つだけであることを確認してください、なぜですか?
Microsoftのドキュメント、WikipediaのSOLIDプリンシペ記事、またはほとんどのITアーキテクトによると、各クラスに1つの責任のみを持たせる必要があります。誰もがこの規則に同意するように見える場合、誰もこの規則の理由について同意するように思われないので、私はその理由を知りたいです。 メンテナンスの改善を挙げている人もいれば、簡単なテストを提供したり、クラスをより堅牢にしたり、セキュリティを強化したりする人もいます。何が正しいのか、実際にはどういう意味ですか?なぜメンテナンスが改善され、テストが簡単になり、コードがより堅牢になるのですか?

5
あなたがやったことのないプログラミングタスクに直面したとき、何をしますか?
私は3か月前に.NET開発者としてキャリアを始めました。さまざまな技術、パターン、概念に関する長いトレーニングプランの後、私を監督していた開発者は、会社が扱う多くのプロジェクトの1つに参加する準備ができたと判断しました。 最終的にコーディングを開始できることを非常に楽しみにしています。私が参加したチームは、新しいプロジェクトから始めていたため、今のところかなり小さいです。これは、プロジェクトのライフサイクル全体に関わることができるので素晴らしいことです。これは、ASP.NET MVC / ASP.NET Web APIを使用し、フロントエンドでDurandalフレームワークと関連ライブラリを使用するWebベースのSPAプロジェクトです。 私の問題は、同僚と会議を行い、翌月のタスクと見積もりを確立した後、自分がタスクを実行できるかどうかわからない立場にいることです。 作成したタスクを一度も実行したことがないため、どのようにすればよいかわかりません。 たとえば、作成されたタスクの1つは、アプリケーション全体の一般的なエラー処理メカニズムの作成です。 彼がやったことのないタスクに直面したとき、通常どのように進めますか?

3
REPLとインタラクティブシェルの違い
Noobの質問。Wikipediaの定義を読むだけでは、REPLとインタラクティブシェルの違いを知ることができません。 Wikiは、REPLは特定の種類の対話型言語シェルであると指摘しています。それは適切なサブセットですか?Wikiの定義は、用語REPLをLispのような言語に制限しているように見えますが、記載されているプロパティには実際に顕著な特徴は含まれていません。 特に、IPythonをREPLと呼ぶのは正しいでしょうか?

8
チューリング完全ではない「有用な」プログラミング言語を持つことは実際に可能ですか?
言語がチューリング完全でなくてはならないことが受け入れられている場合、チューリング完全ではない「有用な」プログラミング言語を持つことは実際に可能ですか? これは、マークアップ言語やクエリ言語ではなく、伝統的な意味での「プログラミング」言語に関するものであることを明確にする必要があります。

8
プログラミングでDAG(Directed Acyclic Graph)を使用する場合
私は最近ectoという名前のフレームワークを見つけました。 このフレームワークでは、「plasm」という名前の基本コンポーネントは、ecto Directed Acyclic Graphです。ectoでは、plasmはectoスケジューラーで操作できます。 このメカニズムの利点は何ですか、また他のどのような状況でDAGの概念を活用できますか?

2
PHPが関数のオーバーロードをサポートしないのはなぜですか?
プログラミング言語の重要な機能の1つは、引数を介して関数をオーバーロードする機能を持つことだろうかと思います。これはオブジェクト指向プログラミングの文脈において不可欠だと思います。 意図的に取り残されて許可されていませんか?または、オーバーロードは良い習慣ではありませんか?


8
趣味のプロジェクトをリリースすることへの恐怖-克服する方法?[閉まっている]
この質問がソフトウェア開発に厳密に関連しているかどうかはわかりませんが、試してみます。 多くのプログラマーのように、私は趣味のプロジェクトに取り組むことが大好きです。時々、一見良いアイデアがあまり良くないことが判明したので、私はプロジェクトをやめました。しかし、時には、プロジェクトから役に立つものが出てきます。それで、私はそれをリリースし、世界に提示することができますよね? 違う。どういうわけか、私はこの一歩を踏み出すことができないようです。私は自分のコードが十分ではないことを恐れており、常に最適ではないもの、追加できる機能について考えることができます。だから、私は何もリリースせず、興味を失い、ある時点でプロジェクトを放棄します。 これは正常ですか?このような状況をどのように克服しますか?

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