ソフトウェア工学

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

5
悪い習慣-ケースを切り替えて環境を設定する
私が開発者として働いてきたこの3年間で、ユーザーがswitchステートメントを使用してURLのパス(バックエンドとフロントエンドの両方)を設定する多くの例を見てきました。以下に例を示します。 バックエンドの例(C#): public static string getHost(EnvironmentEnum environment){ var path = String.Empty; switch (environment) { case EnvironmentEnum.dev: path = "http://localhost:55793/"; break; case EnvironmentEnum.uat: path = "http://dev.yourpath.com/"; break; case EnvironmentEnum.production: path = "http://yourpath.com/"; break; } return path; } フロントエンドの例(JavaScript): (function () { if (window.location.host.indexOf("localhost") !== -1) { window.serviceUrl = "http://localhost:57939/"; } else …

3
GOPATHの外部のGoプロジェクトのソースコードを持っているのは悪い考えです
私はGoを使用して新しいプロジェクトに取り組んでおり、私たちは全員Goに新しいです。標準のgoディレクトリ構造に従い、すべてのコードを $ GOPATH / src / github.com / companyname / projectname gitリポジトリのルートでもあります 標準の推奨パスレイアウトは、特にGoベースのrest / httpバックエンドやhtml / javascriptフロントエンドなどの多言語プロジェクトで作業している場合、少し奇妙に見えます。その場合、プロジェクト構造を次のようにしたいと思うでしょう。 / doc/ src/ server/ main.go module1/ module.go client/ index.html Makefile しかし、実際にはGOPATH内にコードを配置する必要がありますか? 試みとして、ソースコードがGOPATHの外にある小さなプログラムを作成しました。プロジェクトをパッケージに簡単に分割できるので、mainパッケージはを使用fooしてfoo/フォルダー内のパッケージを参照できますimport "./foo"。 私が見る限り、これが私を許さない2つのことがあります: 他のコードはこのコードをインポートできません。これは、企業向けのサービスを構築しているため、問題ではありません。 go installインストールに使用できません。これも問題ではありません。ビルドパイプラインはツールをインストールします。 ただし、ビルドサーバーはワークスペースをGOPATH内に配置できません。 そのようなアプローチは推奨されませんか?もしそうなら、なぜそうですか? リストした2つ以外のマイナスの副作用はありますか? これは企業のプライベートプロジェクトであり、公開のオープンソースコードではないことに注意してください。 GOPATHから実際のプロジェクトを切り離すのは魅力的ですが、Shuステージにいるときはルールを破る際には注意が必要です。
32 go 

6
ネストされた関数呼び出しをインライン化できる場合、プログラムはなぜ呼び出しスタックを使用するのですか?
コンパイラに次のようなプログラムを取らせてはいけません。 function a(b) { return b^2 }; function c(b) { return a(b) + 5 }; それを次のようなプログラムに変換します。 function c(b) { return b^2 + 5 }; これにより、コンピュータがc(b)の返信先アドレスを覚える必要がなくなりますか? プログラムを格納し、コンパイルをサポートするために必要なハードディスク領域とRAMの増加が(それぞれ)呼び出しスタックを使用する理由だと思います。あれは正しいですか?

8
Javaの優れたスタイル(インスタンス変数と戻り値)
クラスのいくつかのメソッドで共通のデータを使用する必要がある場合、これらの2つの方法のどちらを使用するかを決めるのに苦労することがよくあります。より良い選択は何でしょうか? このオプションでは、インスタンス変数を作成して、追加の変数を宣言する必要を回避し、メソッドパラメーターの定義を回避することもできますが、これらの変数がインスタンス化/変更される場所はそれほど明確ではありません。 public class MyClass { private int var1; MyClass(){ doSomething(); doSomethingElse(); doMoreStuff(); } private void doSomething(){ var1 = 2; } private void doSomethingElse(){ int var2 = var1 + 1; } private void doMoreStuff(){ int var3 = var1 - 1; } } または、ローカル変数をインスタンス化して引数として渡すだけですか? public class MyClass { MyClass(){ int var1 …

3
アドレス0000000Cは特別なアドレスですか?
プログラミングするとき、時々物事が壊れます。間違いを犯し、プログラムが間違ったアドレスから読み取ろうとしています。 多くの場合、これらの例外は次のようなものであることを私に際立たせます: Access violation at address 012D37BC in module 'myprog.exe'. Read of address 0000000C. 今、私は多くのエラーログを見て、私にとって際立っているのは、0000000Cです。これは「特別な」住所ですか?不正な読み取りを伴う他のアクセス違反が表示されますが、アドレスはランダムに見えますが、これはまったく異なる状況で繰り返し表示されます。

6
なぜ人々はDBALではなくREST APIを行うのですか?
過去2つの会社では、Webアプリを介してデータを照会するためにREST APIを使用していました。すなわち。Webアプリに直接SQLを実行させる代わりに、REST APIを呼び出し、SQLを実行して結果を返します。 私の質問は...なぜこれが行われるのですか? 第三者にさらされるとしたら、理解できました。完全なDBよりも制限されたREST APIを公開する方が適切です。しかし、これらの企業の両方ではそうではありません。 これらのREST APIを使用すると、DBMSを簡単に切り替えることができるようになりました。しかし、それはデータベース抽象化レイヤー(DBAL)のポイントではありませんか?ORMをDBALとして使用するか、生のSQLを記述し、必要に応じてDBALにDB固有のものを変換させることができます(たとえば、MySQLのLIMITをMSSQLのTOPに変換します)。 いずれにせよ、それは私には不要のようです。また、問題の診断も難しくなると思います。Webアプリのレポートが間違った数値を提供している場合、SQLクエリをダンプすることはできません。RESTURLをダンプしてから、REST APIとして機能するプロジェクトに移動して、そこからSQLを取り出す必要があります。そのため、診断プロセスの速度を低下させる間接的な余分なレイヤーです。

5
Windows / Linuxがリレーショナルデータベース(RDBMS)を使用しないのはなぜですか?
Windows / Linuxがリレーショナルデータベース(RDBMS)を使用しないのはなぜですか? ファイルシステムを使用してすべてのデータを保存していることは知っていますが、Webサイト/ Webアプリで使用しているようなデータベースを使用する方が効率的だと思いませんか? ストレージ用のデータベースを介したファイルシステムの使用について詳しく説明してください。 これは、テキストファイルからのデータの解析よりもデータベースの使用を優先すべき場合の重複ではありませんか?私はオペレーティングシステムのコンテキストのみの観点から話しているが、その質問は一般化されている。

5
なぜn層開発のコードベースは、今ではJavaScriptコードの量が同じかそれ以上ではないのですか?
私は長い間Webプログラミングを行ってきましたが、どこかで、今日の仕事をしている理由を追跡できませんでした(または、どうしてこのように物事をするようになったのですか)。 私は基本的なASP Web開発から始めましたが、非常に早い段階で、ページ上でディスプレイとビジネスロジックが混在していました。クライアント側の開発は大きく異なり(VBScript、さまざまなJavaScriptの種類)、サーバー側の検証について多くの警告がありました(したがって、クライアント側のロジックからは遠ざかりました)。 その後、しばらくの間ColdFusionに移りました。ColdFusionはおそらく、タグを使用して表示ロジックとビジネスロジックを分離した最初のWeb開発フレームワークでした。私には非常にはっきりしているように見えましたが、非常に冗長であり、ColdFusionは市場の需要が高くなかったため、先に進みました。 その後、ASP.NETバンドワゴンに飛び乗り、MVCアプローチを使用し始めました。また、Javaはエンタープライズシステムの象牙の塔の言語であるように思われ、MVCアプローチも試しました。その後、ASP.NETはこのMVVM設計パターンを開発し、Java(正確にはJ2EEまたはJEE)も苦労し、MVC2アプローチを採用しました。 しかし、今日、私が発見したのは、バックエンドプログラミングではなく、興奮と進歩がそこにあるということです。また、サーバー側ベースのMVCプラクティスは時代遅れのようです(人々はもうJSTLを実際に使用していますか?)。今日、私が取り組んでいるほとんどのプロジェクトで、JavaScriptフレームワークとクライアント側の開発は、すべてのエキサイティングで革新的な進歩が行われている場所であることがわかりました。 サーバーからクライアント側の開発へのこの移行が行われたのはなぜですか?JEEプロジェクトの1つの単純な行カウントを行いましたが、JavaScriptにはJavaよりも多くのコード行があります(サードパーティライブラリを除く)。JavaやC#などのプログラミング言語を使用したほとんどのバックエンド開発は、単にRESTのようなインターフェイスを作成することであり、表示、視覚化、データ入出力、ユーザーインタラクションなどのすべての苦労が対処されていることがわかりますAngular、Backbone、Ember、Knockoutなどのクライアント側フレームワーク経由 jQueryの前の時代に、n層開発のMVCのM、V、Cの間に明確な概念線があった多くの図を見ました。jQuery後、これらの線はどこに描かれますか?MVCとMVVMは、クライアント側のJavaScriptコードにすべて揃っているようです。 私が知りたいのは、なぜそのような移行をしたのですか(サーバー側プログラミングの強調からクライアント側へ、コンパイル言語の優先からスクリプト言語へ、命令型プログラミングから関数型プログラミングへ、これらはすべて同時に発生したようです) )そして、この移行/シフトはどのような問題を解決しましたか?

7
パフォーマンスのためにCで作成しますか?[閉まっている]
Cは通常C ++よりもパフォーマンスが優れているとよく耳にします。MSVCがCの最新の標準をサポートしていないように思えるまで、それ以外のことは何も考えていませんでしたが、最新のものはC99をサポートしています(私の知る限り)。 OpenGLでレンダリングするためのコードを含むライブラリを作成して、再利用できるようにすることを計画していました。グラフィックに関しては、パフォーマンスの向上を歓迎するため、ライブラリをCで作成することを計画していました。 しかし、それは本当に価値があるでしょうか?ライブラリを使用するコードはおそらくC ++で書かれているため、一般的にはC ++でコーディングすることを好みます。 ただし、パフォーマンスにわずかな違いさえ生じる場合は、Cを使用します。 また、このライブラリは、Windows / OS X / Linux全体で動作するようにするものであり、すべてをネイティブにコンパイルする可能性があります(Windows用のMSVC、OS X用のClangまたはGCC、およびLinux用のGCC)。 。またはおそらくすべてのインテルのコンパイラ)。 私は周りを見回し、いくつかのベンチマークなどを見つけましたが、私が見たものはすべて、MSVCとClangではなくGCCを扱っています。また、ベンチマークでは使用言語の標準については言及していません。誰もこれについて考えていますか? 編集:数年以上の経験を経て、この質問に対する私の見解を共有したかっただけです。C ++でこの質問をしていたプロジェクトを書くことになりました。私は、Cでリンクできるようにするために、できる限り少量のパフォーマンスを引き出したいと考えていたのと同じ頃に、Cで別のプロジェクトを開始しました。数ヶ月前、私は本当にマップと高度な文字列操作。私はC ++標準ライブラリのこの能力を知っていて、最終的に標準ライブラリのそれらの構造は、妥当な時間内にCで実装できるマップや文字列よりもパフォーマンスが高く安定しているという結論に達しました。Cでリンク可能であるという要件は、C ++コードへのCインターフェイスを記述することで簡単に満たされました。これは、不透明(OPAQUE)型で迅速に行われました。C ++でのライブラリの書き換えは、Cでの書き込みよりもはるかに高速であるようで、バグ、特にメモリリークが発生しにくい傾向がありました。プラットフォーム固有の実装を使用するよりもはるかに簡単な標準ライブラリスレッドライブラリを使用することもできました。最終的には、C ++でライブラリを作成することで、パフォーマンスコストをわずかに抑えながら大きなメリットを得ることができたと思います。私はまだC ++バージョンのベンチマークを行っていませんが、私が書いたものよりも標準ライブラリのデータ構造を使用することで、ある程度のパフォーマンスを得た可能性さえあると信じています。ライブラリをC ++で記述すると、パフォーマンスコストはおそらくわずかですが、大きなメリットが得られたと思います。私はまだC ++バージョンのベンチマークを行っていませんが、私が書いたものよりも標準ライブラリのデータ構造を使用することで、ある程度のパフォーマンスを得た可能性さえあると信じています。ライブラリをC ++で記述すると、パフォーマンスコストはおそらくわずかですが、大きなメリットが得られたと思います。私はまだC ++バージョンのベンチマークを行っていませんが、私が書いたものよりも標準ライブラリのデータ構造を使用することで、ある程度のパフォーマンスを得た可能性さえあると信じています。

4
最小知識の原則
最小知識の原理の背後にある動機は理解していますが、それを設計に適用しようとすると、いくつかの欠点があります。 この原則の例の1つ(実際には使用しない方法)は、Head First Design Patternsの本にあり、この原則の観点から、他のメソッドの呼び出しから返されたオブジェクトでメソッドを呼び出すのは間違っていると述べています。 。 しかし、そのような機能を使用することが非常に必要な場合があるようです。 たとえば、ビデオキャプチャクラス、エンコーダクラス、ストリーマークラスなどのいくつかのクラスがあり、それらはすべて基本的な他のクラスVideoFrameを使用します。また、相互作用するため、たとえば次のようなことができます。 streamer クラスコード ... frame = encoder->WaitEncoderFrame() frame->DoOrGetSomething(); .... ご覧のとおり、この原則はここでは適用されません。この原則をここで適用できますか、またはこの原則をこのような設計に常に適用できるわけではありませんか?

3
依存性注入はどのように結合を増加させますか?
依存性注入に関するウィキペディアのページの短所セクションには、次のことが記載されています。 依存性注入は、サブシステムのユーザーにそのサブシステムのニーズを提供するように要求することにより、結合を増加させます。 依存性注入に対する記事へのリンク付き。 依存性注入により、クラスは具体的な実装の代わりにインターフェースを使用します。その結果、結合が減少するはずです。 私は何が欠けていますか?依存性注入はどのようにクラス間の結合を増加させますか?

4
状態、可変状態、および不変状態とは何ですか?
これは初心者向けの質問ですが、Googleで初心者向けの十分な答えを見つけることができませんでした。 「状態」と言うとき、人々は何を意味しますか?一般的なプログラミング、特にオブジェクト指向プログラミングでは? また、可変および不変の状態とは何ですか-再び、一般的にプログラミングで、具体的にはOOPでも?
32 state 

1
Bowerを使用する理由 [閉まっている]
Python pip、Node npm、Ruby Gemsなどのパッケージマネージャーの利点は、アプリケーションパスにファイルを追加するだけではないため、十分に評価できます。 多分私はポイントを失っている、または私は鈍感であるが、ここに私が見ることができるネガティブがある: プロジェクトをビルドする際の別のステップ 別のパッケージマネージャー(yo dawg)を介してインストールする別個の依存関係 bower.jsonおよび/またはでプロジェクトのルートをより混乱させる.bowerrc レジストリが最新であり、正確であり、利用可能であることへの依存 画像などの一部のインポート/参照が機能しない npmと大きな重複があり、多くの場合、使用するリソースが不明です。 陽性私が見ることができるが、これらのとおりです。 依存関係を手動でダウンロードする必要はありません オプションで、ユーザープロンプトなどに基づいてスキャフォールディングの一部としてパッケージをインストールする 私は気付いていないメリットを知りたいのですが、私は本当に知りたいと思う挑発的なことをしようとしているのではないと言ってください。

11
WHERE句で結合されたクエリと、実際のJOINを使用するクエリの間に重要な違いはありますか?
ではSQLを学びハード・ウェイ(エクササイズ6) 、作者では、以下のクエリ: SELECT pet.id, pet.name, pet.age, pet.dead FROM pet, person_pet, person WHERE pet.id = person_pet.pet_id AND person_pet.person_id = person.id AND person.first_name = "Zed"; その後、次のように言います: 実際には、これらの種類のクエリを機能させる「結合」と呼ばれる他の方法があります。これらの概念はめちゃくちゃ混乱しているので、今のところは避けています。とりあえずこのテーブルの結合方法に固執し、これが何らかの理由で遅いか「低クラス」であることを伝えようとする人々を無視してください。 本当?なぜですか?
32 sql 

4
手続き型プログラミングとは何ですか?OOPとはどのくらい違いますか?関数型プログラミングと同じですか?
私はJavaで非常にオブジェクト指向(OO)スタイルでプログラミングしています。OOPは非常に直感的に理解できますが、他の種類のプログラミングに関する知識はほとんどありません。 手続き型プログラミングとは何ですか?OOPとはどのくらい違いますか?関数型プログラミングと同じものですか? 私は、オブジェクト指向ではないプログラミングはすべて手続き型であると考えていました。しかし、私はこれが真実ではないと考え始めています。

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