ソフトウェア工学

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

8
毎年新しいプログラミング言語を習得する場合、リストはどうあるべきですか?[閉まっている]
現在のところ、この質問はQ&A形式には適していません。回答は、事実、参考文献、または専門知識によってサポートされると予想されますが、この質問は、議論、議論、世論調査、または広範な議論を求める可能性があります。この質問を改善し、場合によっては再開できると思われる場合は、ヘルプセンターをご覧ください。 7年前に閉鎖されました。 「実用的なプログラマー」の第1 章の最初の学習目標は次のとおりです。 毎年少なくとも1つの新しい言語を学びます。異なる言語は同じ問題を異なる方法で解決します。いくつかの異なるアプローチを学習することで、思考を広げ、ゲッターがruに陥るのを防ぐことができます。[...] キャリア全体でこれを達成するために、言語のリストはかなり長くなる可能性があります(特に管理に「進歩」したくない場合)。明らかに、プログラマー(または任意の形式)の教育は、商業的に有用な言語のコア(求人掲載からの通常のリスト:C、C ++、Ruby、Python、JavaScript、C#、Java、VB、.. 。)。さらに、公式または非公式の学習プログラムは、機能的なアプローチ(Haskell、LISP、ML派生言語など)をカバーしている可能性があります しかし、一度そのリストの合理的なサブセットが学習されると、次は何で、なぜですか?


6
いつストアドプロシージャを使用する必要がありますか?
私は私が移動する方が良いだろう(もしあれば)どのような状況では、コードとEntity Frameworkののメイク使用されているすべての私のビジネス・ロジックを、持っている場合は、いくつかのストアドプロシージャにビジネスロジックを、代わりのコードでそれをすべて保ちますか? 明確にするために、代わりにではなく、現在のセットアップ(コード内のビジネスロジック)と組み合わせて意味します。ストアドプロシージャですべてのビジネスロジックを使用することの長所と短所を求めている同様の質問を多数見ましたが、ビジネスロジックの残りを保持しながら、エッジケースロジックでストアドプロシージャを控えめに使用することについてはあまり知りませんでしたコードで。 違いがある場合は、MSSQLとEntity Frameworkを使用しています。 これらは、以前にストアドプロシージャを使用したことがある状況です。 実行に数分かかっていた複雑なレポート(これはWebアプリのページでした)。LINQが提供するものよりもはるかに効率的な(実行に数秒しかかからない)SQLを作成できることがわかりました。 Webアプリケーションは、アプリケーションに関係のない他の多くの機密情報を含む別のデータベースのいくつかのテーブルを読み書きする必要がありました。すべてにアクセスするのではなく、必要なことだけを行い、限られた情報のみを返すストアドプロシージャを使用しました。Webアプリケーションは、テーブルなどにアクセスせずに、このストアドプロシージャのみにアクセスできます。 この質問をする前に私が見た他の投稿: ストアドプロシージャは、世界最大のITソフトウェアコンサルティング会社の1つで悪い習慣ですか? Webアプリケーションのストアドプロシージャにすべてのビジネスロジックを保持することの長所と短所 /programming/15142/what-are-the-pros-and-cons-to-keeping-sql-in-stored-procs-versus-code /dba/2450/what-are-the-arguments-against-or-for-putting-application-logic-in-the-database/2452#2452 ORMを使用せず、ストアドプロシージャを使用する場合

1
(/ did)Bertrand Meyerは、サブクラス化が「閉じた」モジュールを拡張する唯一の方法だと考えるのはなぜですか?
MeyerのObject-Oriented Software Construction(1988)で、彼は次のようにオープン/クローズド原則を定義しています。 モジュールがまだ拡張可能であれば、モジュールは開いていると言われます。たとえば、フィールドに含まれるデータ構造にフィールドを追加したり、実行する一連の機能に新しい要素を追加したりすることができます。 モジュールは、他のモジュールで使用できる場合、閉じられていると言われます。これは、モジュールに明確に定義された安定した説明(情報隠蔽という意味でのインターフェース)が与えられていることを前提としています。 彼は言い​​続けます: モジュールを再度開く場合、古いバージョンに依存しているため、すべてのクライアントを再度開いて更新する必要があります。…[この問題]は、モジュールを新しい関数またはデータ要素によって拡張する必要があるたびに発生し、直接および間接クライアントの変更をトリガーします。...設計とプログラミングに対する古典的なアプローチでは、オープンとクローズの両方のモジュールを記述する方法はありません。 このジレンマに対するMeyerの解決策は、既存のクラスを変更してライブラリモジュールを拡張しないことです。代わりに、既存のクラスをサブクラス化する新しいモジュールを作成し、新しいクライアントがその新しいモジュールに依存するようにします。 今、1988年に、私はTurbo PascalとBlankenship Basicでおもちゃ(手続き)プログラムを書いていました、そして、21世紀の専門的な経験はJVM、CLR、および動的言語でしたので、Meyerの意味がわかりません「設計とプログラミングへの古典的なアプローチ」による。 Meyerのクライアントモジュールを再度開く必要がある理由の具体例(より多くのケースを必要とする、より多くのメンバーを含む列挙のswitchステートメント)は十分に合理的なようですが、ライブラリに機能を追加するたびにアサーションを正当化することはほとんどありませんモジュール、すべてのクライアントを更新する必要があります。 この主張が1988年に自明であると思われる歴史的な理由はありますか?たとえば、C静的ライブラリに関数またはデータ構造を追加すると、下位互換性のあるAPIでもクライアントを再コンパイルする必要があるようにレイアウトが変更されましたか?または、MeyerはAPIの下位互換性を強制するメカニズムについて本当に話しているだけですか?

3
メソッドチェーンを介してコンテキストを渡すためのパターン
これは、非常に多くのように思われる設計上の決定です。コンテキストを必要としないメソッドにコンテキストを渡す方法にコンテキストを渡す方法。正しい答えがありますか、それともコンテキストに依存しますか。 ソリューションを必要とするサンプルコード // needs the dependency function baz(session) { session('baz'); } // doesn't care about the dependency function bar() { baz(); } // needs the dependency function foo(session) { session('foo') bar(); } // creates the dependency function start() { let session = new Session(); foo(session); } 可能な解決策 スレッドローカル グローバル コンテキストオブジェクト …

4
Chrome V8はどのように機能しますか?そして、そもそもなぜJavaScriptはJITコンパイルされなかったのですか?
私は通訳者/コンパイラを研究してきましたが、その後、JITコンパイル、特にGoogle ChromeのV8 Javascript Engineに出会いました。 私の質問は- どのように標準の解釈よりも速くできますか? そもそもJITコンパイルが使用されなかったのはなぜですか? 私の現在の理解 すべてのJavascriptプログラムはソースコードとして開始され、実行方法に関係なく、最終的にはマシンコードに変換されます。 JIT-CompilationとInterpretationは 両方ともこのパスに従う必要があります。どのようにJIT-Compilationを高速化することができますか(また、AOT-Compilationとは異なり、JITは時間制約があるため)。 JIT-Compilationは、ウィキペディアのJIT-Compilation Articleに基づいた比較的古いイノベーションのようです。 「最初に公開されたJITコンパイラは、一般的に1960年に McCarthyによってLISPで動作するとされています。」 「Smalltalkの(C。1983)たとえば、マシンコードへの変換は、オンデマンドで行われた。JITコンパイルの新たな側面を開拓し、その結果は後で使用するためにキャッシュされた。メモリが不足になった場合、システムはこのコードと再生成の一部を削除しますそれが再び必要になったとき。」 では、なぜJavascript が最初から解釈されたのですか? 私は非常に混乱しており、これについて多くの研究を行ってきましたが、満足のいく答えは見つかりませんでした。 とても明確で簡潔な回答をいただければ幸いです。また、通訳者、JITコンパイラなどについての追加説明が必要な場合は、それも歓迎します。

6
実装の隣のロギングはSRP違反ですか?
アジャイルなソフトウェア開発とすべての原則(SRP、OCPなど)を考えるとき、ロギングをどのように扱うかを自問します。 実装の隣のロギングはSRP違反ですか? yes実装はロギングなしで実行することもできるはずだからです。それでは、より良い方法でロギングを実装するにはどうすればよいですか?いくつかのパターンを確認し、ユーザー定義の方法で原則に違反するのではなく、原則に違反することが知られているパターンを使用する最良の方法は、デコレータパターンを使用することであるという結論に達しました。 SRP違反のない完全に多数のコンポーネントがあり、ロギングを追加するとします。 コンポーネントA コンポーネントBはAを使用します Aのロギングが必要なので、Aで装飾された別のコンポーネントDを作成し、両方ともインターフェースIを実装します。 インターフェースI コンポーネントL(システムのロギングコンポーネント) コンポーネントAはIを実装します コンポーネントDはIを実装し、Aを装飾/使用し、ロギングにLを使用します コンポーネントBはIを使用します 利点:-ロギングなしでAを使用できます-Aをテストすると、ロギングモックが不要になります-テストが簡単になります 欠点:-より多くのコンポーネントとより多くのテスト これはもう1つの公開討論の質問のように思えますが、デコレータやSRP違反よりも優れたログ戦略を誰かが使用しているかどうかを実際に知りたいです。デフォルトのNullLoggerであり、syslogロギングが必要な場合、実行時に実装オブジェクトを変更する静的シングルトンロガーはどうでしょうか。

7
コーディングスタイルの問題:パラメーターを受け取り、それを変更し、そのパラメーターを返す関数が必要ですか?
私は友人と、これらの2つの慣習が単に同じコインの両面であるのか、それとも本当に優れているのかについて、少し議論しています。 パラメーターを受け取り、そのメンバーに入力してから返す関数があります。 Item predictPrice(Item item) 渡されたのと同じオブジェクトで機能するため、アイテムを返す必要はないと考えています。実際、発信者の観点から見ると、もしそうでない場合は、新しいアイテムを返すと期待できるので、問題を混乱させます。 彼はそれが違いを生まないと主張し、それが新しいアイテムを作成してそれを返すかどうかさえ問題ではないだろうと主張する。次の理由から、私は強く反対します。 アイテムパス(またはポインターなど)への複数の参照がある場合、新しいオブジェクトを割り当てて返すことは、それらの参照が正しくないため、重要です。 非メモリ管理言語では、新しいインスタンスを割り当てる関数はメモリの所有権を要求するため、ある時点で呼び出されるクリーンアップメソッドを実装する必要があります。 ヒープへの割り当ては潜在的にコストがかかるため、呼び出された関数がそれを行うかどうかが重要です。 したがって、オブジェクトを変更するか、新しいオブジェクトを割り当てるかは、メソッドシグネチャを介して確認できることが非常に重要であると考えています。結果として、関数は渡されたオブジェクトを変更するだけなので、署名は次のようになっているはずです。 void predictPrice(Item item) すべてのコードベース(私たちが取り組んでいる言語であるJavaではなく、明らかにCおよびC ++コードベース)で、上記のスタイルは本質的にかなり経験豊富なプログラマーによって守られ、守られています。彼は、私のコードベースと同僚のサンプルサイズは、考えられるすべてのコードベースと同僚のなかで小さいため、私の経験は優れているかどうかの真の指標ではないと主張しています。 それで、何か考えは?

1
誰かがVモデルプロセスを説明できますか?なぜウォーターフォールモデルと異なるのですか?
Vモデルは、滝の下半分が上に曲がってVを形成しているウォーターフォールモデルに過ぎないようです。新しいものを追加する方法がわかりません。 図から、私もフローを理解していません。すべての方向を指す矢印があり、最初に来るものを理解できません。Vを左上から下の中央まで、続いて右上まで戻ってきますか?または、アイテムが低くなる前にすべてを高くしてVを下に進めますか? インターネットには、このモデルの十分な説明がありません。誰かがそれを本当のStackExchange形式で説明できたら素晴らしいでしょう:)

3
再帰を使用せずにツリーを横断するにはどうすればよいですか?
メモリノードツリーが非常に大きいため、ツリーを走査する必要があります。各子ノードの戻り値を親ノードに渡します。これは、すべてのノードのデータがルートノードまでバブルするまで実行する必要があります。 トラバーサルはこのように機能します。 private Data Execute(Node pNode) { Data[] values = new Data[pNode.Children.Count]; for(int i=0; i < pNode.Children.Count; i++) { values[i] = Execute(pNode.Children[i]); // recursive } return pNode.Process(values); } public void Start(Node pRoot) { Data result = Execute(pRoot); } これは正常に機能しますが、コールスタックがノードツリーのサイズを制限するのではないかと心配しています。 への再帰呼び出しExecuteが行われないように、どのようにコードを書き直すことができますか?
19 c#  optimization  trees 

4
インスタンスフィールドに依存しないメソッドを静的にしますか?
最近、統合テストフレームワーク用、Javaプロジェクト用にGroovyでプログラミングを開始しました。Intellij IDEAをGroovyプラグインで使用していますが、非静的でインスタンスフィールドに依存しないすべてのメソッドの警告として表示されて驚いています。ただし、Javaでは、これは問題ではありません(少なくともIDEの観点から)。 インスタンスフィールドに依存しないすべてのメソッドを静的関数に変換する必要がありますか?trueの場合、これはGroovy固有のものですか、それとも一般的なOOPで利用可能ですか?なぜ?

2
MavenのGitリポジトリを構成する最良の方法
Gitでプロジェクトを構成する方法について、いくつかのアドバイスが必要です。Javaを使用し、Mavenはビルドツールです。Mavenは、最終的にすべてのプロジェクトに共通の祖先があると想定しています。Mavenは、Apache Foundationがプロジェクトをセットアップする方法が正確にセットアップされていない場合、本当のドラマクイーンになることもあります(リリースプラグインを使用している人は、おそらく私が話していることを知っています)。 プラグインのバージョンとビルド構成(リポジトリ構成、ビルドするアーティファクト、命名規則、プラグインバージョンなど)を制御する最上位の親pomが必要です。Mavenは、すべてのITプロジェクトをそのメインプロジェクトのサブフォルダーに入れたいと考えています。これは、組織の1つの大規模なGitリポジトリを意味します。 これは非常に騒がしい環境になります。関連のないプロジェクトに取り組んでいる2つのチームがある場合、それらは常に他のチームからマージをプルする必要があります。理想的には、プロジェクトごとに1つのリポジトリが必要です。 しかし、そのような種類は、サブプロジェクトがサブフォルダーであることを要求する Mavenの非常に階層的なモデルと衝突します。 人々がこれら2つのモデルをどのように調整したかについて、いくつかのアドバイスが必要です。

4
C / C ++の関数呼び出しのスタックフレームを理解していますか?
スタックフレームがどのように構築され、どの変数(パラメーター)がどの順序でスタックにプッシュされるかを理解しようとしていますか?一部の検索結果は、C / C ++コンパイラが関数内で実行された操作に基づいて決定することを示しました。たとえば、関数が渡されたint値を1だけインクリメントし(++演算子に類似)、それを返すことになっている場合、関数のすべてのパラメーターとローカル変数をレジスターに入れます。 どのレジスタが戻り値または値渡しパラメータに使用されるのか疑問に思っています。参照はどのように返されますか?コンパイラーはeax、ebx、ecx、edxをどのように選択しますか? 関数呼び出し中にレジスター、スタック、およびヒープ参照がどのように使用、構築、および破棄されるかを理解するには、何を知る必要がありますか?
19 c++  c  compiler  stack 

4
なぜasyncキーワードが必要なのですか?
.Net 4.5でasync / awaitをいじり始めました。私が最初に興味を持っているのは、なぜasyncキーワードが必要なのですか?私が読んだ説明は、マーカーであるため、コンパイラはメソッドが何かを待っていることを知っているというものでした。しかし、コンパイラはキーワードなしでこれを理解できるはずです。それでは、他に何をしますか?
19 c#  .net 

7
データ転送オブジェクトのインターフェイスを作成する必要がありますか?
データ転送オブジェクトのインターフェースを作成するのは良い考えですか、悪い考えですか?通常、オブジェクトは可変であると仮定します。 私の例はJavaですが、同様の概念を持つ他の言語にも適用できるはずです。 interface DataTransferObject { String getName(); void setName(String name); } class RealDataTransferObject implements DataTransferObject { String name; String getName() { return name; } void setName(String name) { this.name = name; } } もちろん、これは単純化された例であり、実際にはもっと多くのフィールドがあるかもしれません。

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