ソフトウェア工学

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

2
単一の真実の出所と単一の責任の原則の違いは?
そのため、プログラミングコードインタビューに関するビデオシリーズを見て、単一の真の情報源という用語を見つけました。 私が理解したことから、それは真実の単一のソースが複数回使用される可能性のあるあらゆるタイプの操作/ロジックのカプセル化であることを意味しました。 SRPは、何度も使用される可能性のある特定の操作やロジックをカプセル化するという意味でほぼ同じものです。 ここで私が見逃している非常に微妙なものはありますか? いつもありがとうございました。

3
JUnitテストですべての変数を宣言することの利点/欠点
作業中の新しいコードの単体テストをいくつか作成し、コードレビューのために送りました。私の同僚の1人が、多くのテストで使用される変数をテストのスコープ外に配置した理由についてコメントしました。 私が投稿したコードは本質的に import org.junit.Test; public class FooUnitTests { @Test public void testConstructorWithValidName() { new Foo(VALID_NAME); } @Test(expected = IllegalArgumentException.class) public void testConstructorWithNullName() { new Foo(null); } @Test(expected = IllegalArgumentException.class) public void testConstructorWithZeroLengthName() { new Foo(""); } @Test(expected = IllegalArgumentException.class) public void testConstructorWithLeadingAndTrailingWhitespaceInName() { final String name = " " + …

5
C / C ++で記述されたアプリケーション間でメモリを共有する方法
ロボット工学の制御のために、C / C ++で書かれたプログラムを実行しています。基本的に、3つの異なるプログラムが同時に実行され、共有メモリを介して通信します。私が見つけた周りのグーグルリンギングは、vxWorksやboostライブラリのプロセス間ヘッダーのようなものだ(Boostのドキュメント:プロセス間でのメモリの共有)。 今、私は実装を見たくありません、上のリンクを読むことができます。しかし、boostライブラリがこれをどのように実行するかについて、頭を動かすことはできません。つまり、1つのアプリケーションがメモリを割り当て、他のアプリケーションがそのメモリにアクセスしますが、それらはどのように通信しますか?これを行うのは危険ではありませんか?
9 c++  c  memory  memory-usage  boost 

2
C#でカスタム例外を作成するタイミング
COMポートを介して単純なハードウェアデバイスとインターフェイスするクラスを作成しています。デバイスはさまざまなモードを使用するように構成できるため、私のクラスにはタイプSetOperatingModeを取り込む関数があります。次のようになります。enumUsbDeviceMode class UsbDevice { public void SetOperatingMode(UsbDeviceMode mode) { byte[] buffer = new byte[4]; buffer[0] = 0x5A; buffer[1] = 0x02; buffer[2] = (byte)mode; buffer[3] = 0x00; //IO_TYPE is always 0 in this case. _port.Write(buffer, 0, 4); int read = _port.Read(buffer, 0, 2); bool successfulSet = (read == 2 && buffer[0] …

2
REST URL構造でuserIdを指定する必要がありますか?
基本的に、私のアプリの1つの機能は、ログに記録されたユーザーの友達を取得することです。 実際、私は両方の種類のエンドポイントの間で迷っています: GET / api / users / friends GET / api / users /:userId / friends 1を使用userIdすると、認証トークンを通じて到達可能になります。 2を使用すると、サーバーは、渡さuserIdれたと、認証トークンで指定されたログに記録されたユーザーIDとの対応をさらにチェックして、友達などの他のユーザーデータへの悪意のあるアクセスを回避する必要があります。 したがって、1で十分ですが、標準のレストURLのようには聞こえません。 良い習慣とは何ですか?

2
.jarをシールする理由は何ですか?それをどのように確認しますか?
密封されたjarファイルを作成しましたが、密封されていないjarファイルを使用した場合と比較して違いはありません。 瓶が密封されていることを確認するためにどのようなテストを実行できますか? シールされていないものを使用することを好む理由は何ですか? 封印すると、プロジェクトのユーザーに問題が発生しますか?
9 java  security 

7
コードが自動的にカバーされていることをどのように確認しますか?
CI / CDワークフローでTDDにプッシュするために、いくつかの新しいプロジェクト用にBambooサーバーをセットアップしているところです。確かに、単体テストは素晴らしいですが、そこにあるのと同じくらいログだけです。 これは、特定のブランチ(つまり、開発ブランチとメインリリースブランチ)のGIT事前受信フックでより良いかもしれませんが、コードカバレッジを実施する場合は、どのように実施する必要がありますか。私はコミッターを信頼してコードがカバーされていることを確認できて嬉しいですが、勤勉さと一貫性を除いて、これらの事柄をどのように維持するのでしょうか? 要するに、コミット段階またはビルド段階のいずれかで、他の人がどのようにテストカバレッジを自動プロセスとして実施するかを確認したいと思います。

1
マイクロサービスアプリケーションのAngularJSフロントエンドを作成する
私が作成したいMicroservicesすべてのmicroserviceは、フロントエンドの独自の一部を担当しているアプリケーションを、。同時に、AngularJSでフロントエンドをシングルページアプリケーション(SPA)として作成したいと考えています。新しいマイクロサービスがデプロイされると、Webフロントエンドは自動的に新しいフロントエンド部分を取得してSPAに追加します。これを実現する最良の方法は何でしょうか? これが私が思いついたものです。各マイクロサービスは、独自のAngularモジュールを担当できます。次に、顧客がアプリケーションに移動すると、サーバーコンポーネント(ASP.NETまたはJSP)は、どのマイクロサービスがオンラインであるかを確認し、それらのマイクロサービスからの角度モジュールを含むHTMLページを作成できます。 フロントエンドコンポーネントが実行できることは、管理者やVIPの顧客など、拡張された特権を持つ特定の顧客に対していくつかのマイクロサービスを有効にすることです。 もちろん、これが機能するためには、各マイクロサービスが画面上に他のマイクロサービスが何であるかを「知る」ことなく、画面の一部を占めるための優れた構造化された方法が必要です。簡単な解決策は、マイクロサービスごとにタブを作成することです。タブでは、担当のマイクロサービスがその機能をページに配置できます。フロントエンドコンポーネントは、(角度)ルーティングやルックアンドフィールなどの一般的な要素を担当します。 これはこの目標を実現する最良の方法ですか?誰もがこれで経験がありますか?

1
AngularJSの機能をサポートするために邪魔なJavaScriptは必要ですか?
まず、AngularJSについて学習しているだけだと言ってから、この記事を読んでいました。 http://www.ng-newsletter.com/posts/angular-for-the-jquery-developer.html 私の理解では、控えめなJavaScriptは一般に「正しいこと」と考えられています(おそらく議論の余地がありますが、私の質問の範囲外です)。しかし、AngularJSの特定の機能があり、イベントバインディングを次のような属性で指定する必要があるかどうか疑問に思っていましたng-click。AngularJSを使用してインラインイベントバインディングを使用しない方法はありますか? 参考までに:邪魔なJavaScriptは、通常、JavaScriptをHTML自体に結び付けることを指します。控えめなJavaScriptとは、JavaScriptへの参照を持つプレーンテキストのマークアップではなく、JavaScriptまたはその他の手段を使用して、コード動作をDOMにプログラムで適用することを指します。

2
Pythonでインスタンスメソッドをキャッシュする標準的な方法はありますか?
キャッシュしたいpythonスクリプトに計算集中型の関数がいくつかあります。私はスタックオーバーフローの解決策を探しに行き、たくさんのリンクを見つけました: /programming/4431703/python-resettable-instance-method-memoization-decorator https://wiki.python.org/moin/PythonDecoratorLibrary#Memoize http://pythonhosted.org/cachetools/ https://pythonhosted.org/Flask-Cache/(私はこれをフラスコアプリケーションに使用しましたが、これはフラスコアプリケーションではありません)。 結局、これを自分のプログラムに貼り付けてしまいました。それは十分に単純に見えます-そしてうまく働きます。 class memoized(object): '''Decorator. Caches a function's return value each time it is called. If called later with the same arguments, the cached value is returned (not reevaluated). ''' def __init__(self, func): self.func = func self.cache = {} def __call__(self, *args): if not isinstance(args, collections.Hashable): …
9 python 

1
推移的な依存関係によって引き起こされるモジュール依存関係チェーンの悪夢を回避するにはどうすればよいですか?
多くの(ほとんど?)AngularJSの人々は、AngularJSアプリを多くのモジュールに分割することを提唱しているようです。 Brian Fordは彼のブログで、レイヤー(コントローラー、サービスなど)ごとのパッケージ化は「ばかげた」概念であると既に述べているので、ここでは説明しません。(http://briantford.com/blog/huuuuuge-angular-appsを参照してください。) ただし、アプリを機能ごとにモジュール化するとします。おそらく、これらの機能モジュールをロードするための標準のappモジュールに加えて、usersモジュールとmessagesモジュールがあります。ユーザー機能に関連するルートをユーザーモジュールに、メッセージ関連のルートをメッセージモジュールに慎重に配置します。今、私の心の中で、あなたはngRouteの各機能モジュールに依存関係を作成しました。したがって、各モジュールは、依存関係の配列に「ngRoute」をリストする必要がありますよね? 残念ながら、AngularJSはそれを台無しにすることを非常に簡単にします。あなたの場合はアプリのモジュールがロードの両方のユーザーとメッセージが、唯一のユーザーのリストを依存関係として「ngRoute」、それは実行時に問題ではない:$ routeProviderはまだで、あなたの設定機能の中に注入されるメッセージの本質的により解決された、ユーザーのモジュールのngRouteへの依存。 私の問題は、さまざまな機能モジュールをロード/参照する「アプリ」モジュールの一般的なパターンにある可能性があります。推移的な依存関係と同様に、このパターンは私にとって意味があります。問題なのは、Angularの特定の実装が、モジュールがそのモジュールの依存関係を間接的に参照しない場合をマスクできることです。モジュールは特定のアプリのコンテキストで機能する可能性があります(モジュールが別の「アプリ」モジュールによって参照されており、その依存関係も直接または間接的に参照されているため)。ただし、モジュールを別のアプリにコピーすると、失敗します。依存関係がないため。 ほとんどの人は、usersモジュールが基本的にmessagesモジュールの依存関係になっているという事実をあまり考慮しないだろうという印象を受けます。しかし、それは私が過去を見るのに苦労している問題です。私にとって、機能モジュール間にこれらの混乱する依存関係を作成する可能性がある場合、それはモジュール化の正味の利点を実際に減少させ、アプリのすべての機能のすべてのコンポーネントをカプセル化する単一のアプリモジュールを用意するだけです。

5
明示的なコンストラクターを定義した場合、デフォルトのコンストラクターが生成されないのはなぜですか?
class Employee{ String name; int id; //No explicit constructors } これで、次のステートメントを呼び出すことができます。 Employee e1 = new Employee(); 上記のコードを使用すると、コンパイラーはコンストラクターの定義を提供しますEmployee()。 次のように単一の明示的なコンストラクタを定義した場合: class Employee{ String name; int id; Employee(String aName){ this.name=aName; } } さて、次のステートメントを呼び出せないのはなぜですか。 Employee e2 = new Employee(); コンパイラはの定義を提供する方法を知っていますがEmployee()。 さて、明示的なコンストラクタを定義したのにEmployee(String aName)、なぜデフォルトのコンストラクタを使用できないのですか? また、コンパイラーが明示的なコンストラクターを定義した後でもデフォルトのコンストラクターの使用を許可した場合は、デフォルトのコンストラクターのコードを再利用するのに役立ちます。

3
ダックタイピングなしで動的に型付けされた言語を持つことは可能ですか?[閉まっている]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 5年前休業。 この質問はここで尋ねられましたが、不十分な回答を得て、問題を明確にしませんでした。私はそれが再びそれを求めることを正当化すると信じています。 動的に型付けされた言語または静的に型付けされた言語のいずれかでダックタイピングができることを理解しています(ただし、C ++のテンプレートなど、これらの例はまれです)。 しかし、ダックタイピングのない動的に型付けされた言語のようなものがあるかどうかはわかりません。 ダックタイピングとは、オブジェクトのタイプが、特定の時点でのオブジェクトの操作と属性に基づいていることを意味します。ダックタイピングを必然的にサポートせずに動的タイピングを行う方法はありますか? たとえば、このPythonコードを見てみましょう。 def func(some_object) some_object.doSomething() something = Toaster() func(something) 動的型付け言語では、オブジェクトの型は実行時にのみ認識されます。そのため、操作(例some_object.doSomething():)を実行しようとすると、ランタイムには選択肢が1つしかありません。これは、some_objectサポートのタイプかどうかをチェックするdoSomething()ことです。これは、正確にダックタイピングと同じです。 だから、ダックタイピングなしで動的に型付けされた言語を持つことは可能ですか?説明してください。

3
Haskellおよび/またはラムダ計算におけるパラメーターなしのラムダ式
SchemeやPythonなどの熱心な言語では、パラメータなしのラムダ式を使用して、評価を遅延させることができます。たとえば、Scheme(チキンスキーム)の場合: #;1> (define (make-thunk x) (lambda () (+ x 1))) #;2> (define t (make-thunk 1)) #;3> (t) 2 2行目tは未評価の式にバインド(lambda () (+ 1 1))され2、3行目で評価されます。 同様に、Pythonでは: >>> def make_thunk(x): return lambda: x + 1 ... >>> t = make_thunk(1) >>> t() 2 この手法を使用すると、熱心な言語で遅延評価を実装できます。 そのため、言語が既に遅延しており、遅延式を作成する必要がないため、Haskellにはパラメーターなしのラムダ式がないと予想していました。驚いたことに、Haskellではラムダ式を書くことが可能であることがわかりました \() -> "s" これは次の()ような値にのみ適用できます: (\() -> "s") () …

2
NANは、無効なパラメーターが計算に含まれていたことを伝えるのに適していますか?
私は現在、パフォーマンスが重要な環境に配備される数値処理システムに取り組んでいます。数値配列の形式で入力を受け取り(これらはeigenライブラリを使用しますが、この質問の目的では重要ではない可能性があります)、ある範囲の数値計算(行列積、連結など)を実行して出力を生成します。 すべての配列は静的に割り当てられ、そのサイズはコンパイル時にわかります。ただし、一部の入力は無効な場合があります。これらの例外的な場合でも、コードを計算し、無効な値によって「汚染されない」出力を使用する必要があります。 例として、次の簡単な例を見てみましょう(これは疑似コードです)。 Matrix a = {1, 2, NAN, 4}; // this is the "input" matrix Scalar b = 2; Matrix output = b * a; // this results in {2, 4, NAN, 8} ここでの考え方は、2、4、8は使用可能な値ですが、NANはデータの受信者に、そのエントリが無効な値を含む操作に関与していたことを通知し、破棄する必要があります(これは、std::isfinite(value)値を使用する前に確認してください)。 パフォーマンスが重要であり、ヒープ割り当てがオプションではない(そして、boost::optionalまたはポインターなどの他のリソースを消費する構成要素でもない)場合、これは使用できない値を通信および伝播する適切な方法ですか? これを行うより良い方法はありますか?この時点で私は現在の設定に非常に満足していますが、現在の実装についていくつかの新鮮なアイデアや生産的な批評を得ることを望んでいました。
9 c++ 

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