ソフトウェア工学

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

1
Javascriptで必要なモジュールと依存性注入
最近、私の頭の中に疑問が浮かびました: Javascriptの方法は、従来のソフトウェア開発で優れた実践と見なされているほぼすべてに反しますか? このステートメントに関連する一連の質問/観察事項がありますが、StackExchangeの形式を尊重するには、それらを別の質問に分割した方が良いでしょう。 必要なモジュール 最近の標準Javascriptコードは次のようになります。 const someModule = require('./someModule') module.exports = function doSomethingWithRequest() { // do stuff someModule.someFunc() // do other stuff } 長所 カプセル化:モジュールはスタンドアロンで動作し、その機能を実行するために必要なすべてを認識します。 彩色として、クライアントがモジュールを使用するのは簡単です。 短所 貧弱なテスト容易性:これは、DIを使用しない場合の標準ですが、Javscriptなどの動的言語では、mockeryまたはなどのモジュールによって回避することができます* rewire。 それは確かにDIPに違反しています-依存性注入と混同しないでください。-具体的なモジュールしかインポートできないため。 おそらくOCPに違反しています。たとえば、ファイルシステムに(fsモジュールを介して)書き込むログモジュールがあると想像してください。このログモジュールを拡張してネットワークに送信する場合、非常に困難です。 *これはCommonJSまたはAMDモジュールでも動作する可能性があります。それらはほとんどユーザーランドで実装されているためです。ただし、ES6 import構文でこれがどのように可能になるかはわかりません。 依存性注入 依存性注入を使用すると、次のようになります。 module.exports = function doSomethingWithRequest(someModule) { // do stuff someModule.someFunc() // do other stuff } 長所 …

7
大規模なアプリケーションではSTLを回避する必要がありますか?
これは奇妙な質問に聞こえるかもしれませんが、私の部署では次のような状況で問題が発生しています。 ここでは、処理できるように、必要に応じて動的にロードし、後でアンロードするサーバーアプリケーションで作業しています。パフォーマンスの問題。 しかし、私たちが使用している関数は、入力パラメーターと出力パラメーターをSTLオブジェクトとして渡しているため、Stack Overflowの回答で述べたように、これは非常に悪い考えです。(投稿にはいくつかの±ソリューションとハックが含まれていますが、すべてが非常に堅実に見えるわけではありません。) 明らかに、入力/出力パラメーターを標準のC ++型で置き換え、関数内で一度それらからSTLオブジェクトを作成できますが、これによりパフォーマンスが低下する可能性があります。 1台のPCで処理できないほど大きくなる可能性のあるアプリケーションをビルドすることを検討している場合、STLをテクノロジとしてまったく使用しないでください。 この質問についてのさらなる背景:質問について いくつかの誤解があるようです:問題は次のとおりです: 私のアプリケーションは作業を完了するために膨大な量のパフォーマンス(CPU、メモリ)を使用しているので、この作業を分割したいと思います(プログラムはすでに複数の関数に分割されているため)アプリケーションからいくつかのDLLを作成し、それらのDLLのエクスポートテーブルにいくつかの関数を配置することはそれほど難しくありません。これにより、次の状況が発生します。 +-----------+-----------+---- | Machine1 | Machine2 | ... | App_Inst1 | App_Inst2 | ... | | | | DLL1.1 | DLL2.1 | ... | DLL1.2 | DLL2.2 | ... | DLL1.x | DLL2.x | ... +-----------+-----------+---- App_Inst1はMachine1にインストールされているアプリケーションのインスタンスであり、App_Inst2はMachine2にインストールされている同じアプリケーションのインスタンスです。 DLL1.xはMachine1にインストールされているDLLで、DLL2.xはMachine2にインストールされているDLLです。 DLLx.1は、エクスポートされたfunction1をカバーします。 DLLx.2は、エクスポートされたfunction2をカバーします。 次に、Machine1でfunction1とfunction2を実行します。これによりMachine1がオーバーロードされることがわかっているため、App_Inst2にメッセージを送信して、そのアプリケーションインスタンスにfunction2を実行するように要求します。 …
24 c++  stl 

4
プルリクエストでTODOを処理する方法
この質問は、Software Engineering Stack Exchangeで回答できるため、Software Quality Assurance&Testing Stack Exchangeから移行されました。 昨年移行し ました。 プルリクエストの変更を確認すると、「TODO」のメモが付いたコメントに出くわすことがあります。 問題を解決するために使用されるソリューションは改善できますが、かなりの時間投資が必要になります。作成者はより迅速なソリューションを選択しましたが、より良いオプションが潜在的に利用可能であるというコメントを入れました すぐに修正する必要がある既存のバグを回避するための一時的なコードがあります TODOsが一般的にコードベースの存続期間中コードベースに留まることを知っているので、プルリクエストでそれらにどのように対応する必要がありますか?どうすればそれを避けるよう丁寧に要求できますか、またはそれが本当に正当化された場合、PRの作者が将来それをフォローアップすることをどのように確認できますか?

7
実際の90のルール
コードの最初の90%が開発時間の最初の90%を占めています。コードの残りの10%は、開発時間の残りの90%を占めています。 —トムカーギル、ベル研究所 それは実際にはどういう意味ですか?プログラマーはかなりの量の仕事をしており、180%を自分たちから与えているのですか?

8
1日1回のユーザーアクション:24時間のリセットと真夜中のリセット[終了]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 12か月前に閉鎖されました。 ユーザーが1日に1回しかアクションを実行できない場合(たとえば、コンテストの無料チケットを取得する場合)、私の経験で出会った2つの可能性があります。 1)24時間リセット 1日目の午後11時45分にアクションを実行する場合、2日目の11時45分以降にのみアクションを実行できます。彼は2日目の11:44にそれを行うことができません。 2)ミッドナイトリセット(または任意の固定時間) ユーザーが1日目に何時にアクションを実行しても、深夜になり2日目が始まるとすぐに、再びアクションを実行できるようになります。 どちらもユーザーが1日に1つのアクションしか実行できないように制限しますが、ほとんどの場合、方法1に遭遇します。 最初に私は時間を待たなければなりません 長い期間にわたって2番目に、アクションを実行する私のタイムスタンプは、数秒または数分後にそのタイムスタンプで毎日正確にアクションを実行することができないため、ますます遅くなります。 私の意見では事前に述べたユーザーにとっての重大な不利益はありますが、方法1を好むという技術的な理由はありますか? 編集して、指定します。特に、現在の 24時間ごとに1つのフリースピンを獲得するTheory11のフリースピンイベントのように、24時間の実際のタイムギャップは明らかに必要ではない例について話しています。入賞時。

10
例外をスローするか、nullを返すかを制御するパラメーター-良い習慣ですか?
失敗時に例外がスローされるか、nullが返されるかを制御する追加のブール型パラメーターを持つメソッド/関数によく遭遇します。 どちらの場合がより良い選択であるかについてはすでに議論がありますので、ここではこれに焦点を合わせません。たとえば、マジック値を返す、例外をスローする、失敗した場合にfalseを返すなどを参照してください。 代わりに、両方の方法をサポートしたい理由があると仮定しましょう。 個人的には、そのようなメソッドはむしろ2つに分割する必要があると思います。1つは失敗時に例外をスローし、もう1つは失敗時にnullを返します。 それで、どちらが良いですか? A:$exception_on_failureパラメータ付きの1つのメソッド。 /** * @param int $id * @param bool $exception_on_failure * * @return Item|null * The item, or null if not found and $exception_on_failure is false. * @throws NoSuchItemException * Thrown if item not found, and $exception_on_failure is true. */ function loadItem(int $id, bool $exception_on_failure): …
24 exceptions 

6
読みやすさは(参照)パラメーターでconstを使用しない正当な理由ですか?
いくつかの関数を作成するときに、次のようなパラメーターにconstキーワードが見つかりました。 void MyClass::myFunction(const MyObject& obj,const string& s1,const string& s2,const string& s3){ } IDEまたはvimで行を2行に分割することがよくあるので、パラメーターのすべてのconstキーワードを削除したいと思います。 void MyClass::myFunction(MyObject& obj,string& s1,string& s2,string& s3){ } それはconstを使用しない正当な理由ですか?パラメータオブジェクトを手動で変更しないで維持することはできますか?

4
機能的なスタイルの例外処理
関数型プログラミングでは、例外をスローしたり、観察したりすることは想定されていません。代わりに、誤った計算はボトム値として評価する必要があります。Python(または関数型プログラミングを完全に奨励していない他の言語)Noneでは、None何かが「純粋のまま」に失敗したときはいつでも返すことができますしたがって、最初にエラーを観察する必要があります。つまり、 def fn(*args): try: ... do something except SomeException: return None これは純度に違反しますか?もしそうなら、それは純粋にPythonでエラーを処理することが不可能であることを意味しますか? 更新 彼のコメントで、Eric LippertはFPの例外を処理する別の方法を思い出しました。実際にPythonでそれが行われるのを見たことはありませんが、1年前にFPを勉強したときに、Pythonで遊んでみました。ここで、任意のoptional-decorated関数はOptional、通常の出力および指定された例外のリストに対して空の値を返します(指定されていない例外でも実行を終了できます)。Carry遅延評価を作成します。各ステップ(遅延関数呼び出し)Optionalは、前のステップから空でない出力を取得して単純に渡すか、それ以外の場合はnewを渡して評価しますOptional。最終的に、最終値はnormalまたはEmptyです。ここでは、try/exceptブロックはデコレータの後ろに隠されているため、指定された例外は戻り値型シグネチャの一部と見なすことができます。 class Empty: def __repr__(self): return "Empty" class Optional: def __init__(self, value=Empty): self._value = value @property def value(self): return Empty if self.isempty else self._value @property def isempty(self): return isinstance(self._value, BaseException) or self._value is Empty def __bool__(self): …

6
なぜメソッドを「待ち」、すぐにその戻り値を調べるのでしょうか?
で、このMSDNの記事、次のコード例は、(わずかに簡潔にするために編集された)が設けられています。 public async Task<ActionResult> Details(int? id) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } Department department = await db.Departments.FindAsync(id); if (department == null) { return HttpNotFound(); } return View(department); } このFindAsyncメソッドは、DepartmentIDでオブジェクトを取得し、を返しますTask<Department>。次に、部門がすぐにチェックされ、nullかどうかが確認されます。私が理解しているように、この方法でタスクの値を要求すると、待機中のメソッドから値が返されるまでコード実行がブロックされ、事実上これが同期呼び出しになります。 なぜこれをするのですか?Find(id)とにかくすぐにブロックする場合は、単に同期メソッドを呼び出す方が簡単ではありませんか?
24 c#  .net  asp.net-mvc  async 

5
C#で不変オブジェクト間の循環参照をモデル化する方法は?
次のコード例には、部屋を表す不変オブジェクトのクラスがあります。北、南、東、および西は、他の部屋への出口を表します。 public sealed class Room { public Room(string name, Room northExit, Room southExit, Room eastExit, Room westExit) { this.Name = name; this.North = northExit; this.South = southExit; this.East = eastExit; this.West = westExit; } public string Name { get; } public Room North { get; } public Room South { …

2
where条件とcontinueガード句を使用したforeachループのフィルタリング
私はこれを使用するプログラマを見てきました: foreach (var item in items) { if (item.Field != null) continue; if (item.State != ItemStates.Deleted) continue; // code } 私が通常使用する代わりに: foreach (var item in items.Where(i => i.Field != null && i.State != ItemStates.Deleted)) { // code } 私は両方の組み合わせを見てきました。「継続」、特により複雑な条件での読みやすさが本当に好きです。パフォーマンスに違いはありますか?データベースクエリを使用すると、あると想定しています。通常のリストはどうですか?

10
クラスプロパティがクラスの新しいインスタンスを作成して返す場合、それはアンチパターンですか?
私はHeadingいくつかのことを行うと呼ばれるクラスを持っていますが、現在の見出し値の反対を返すこともできるはずであり、Headingクラス自体の新しいインスタンスを作成することで最終的に使用する必要があります。 reciprocal現在の値の反対の見出しを返すために呼び出される単純なプロパティを使用して、Headingクラスの新しいインスタンスを手動で作成するか、HeadingクラスcreateReciprocalHeading()の新しいインスタンスを自動的に作成してそれを返すようなメソッドを作成できますユーザー。 しかし、私の同僚の1だけでクラスを作成するために私をお勧めプロパティと呼ばれるreciprocalそのgetterメソッドを介したクラス自体の新しいインスタンスを返すことを。 私の質問は次のとおりです。クラスのプロパティがそのように動作するのはアンチパターンではありませんか? 私は特に以下の理由で直観的ではないと思います: 私の考えでは、クラスのプロパティはクラスの新しいインスタンスを返すべきではありません。 reciprocalIDEからヘルプを得たり、ゲッター署名を確認したりせずに、プロパティの名前であるが、開発者がその動作を完全に理解するのに役立ちません。 クラスプロパティが何をすべきかについて厳格すぎるのですか、それとも有効な懸念事項ですか?私は常にフィールドとプロパティを介してクラスの状態を管理しようとし、メソッドを介してその動作を管理しようとしましたが、これがクラスプロパティの定義にどのように適合するかはわかりません。

9
ネットワークでバイト順を安全に無視できますか?
クライアントがWindows上で実行され、サーバーがおそらくLinux上で実行されるサーバークライアントアプリケーションを開発しています。後でクライアントをMacとLinuxに移植するかもしれませんが、まだではありません。 最近のすべてのホームコンピューターは、リトルエンディアンで実行されます。私はしばらくグーグルで検索しましたが、ビッグエンディアンで動作するデバイスのリストを実際に見つけることができませんでした。私の知る限り、一部のMotorolaチップは依然としてビッグエンディアンを使用し、おそらく一部の携帯電話を使用します(アプリをスマートフォンに移植する予定はないので、これは私には関係ありません)。サーバーとクライアントの両方がリトルエンディアンで実行されていることがわかっているのに、読み取りと書き込みのために、すべての整数、すべてのショート、すべてのフロート、ダブルなどのバイトを再配置するのはなぜですか? それはただ行う必要のない作業です。だから、私の質問は次のとおりです:エンディアンを安全に無視して、リトルエンディアンのデータを送信できますか?欠点は何ですか?

8
コードレビュー中にテストを書くことは有益ではないでしょうか?
私の同僚が、私が面白いと思うアイデアを思いつきました。 TDDを行わないと想定してレビューを行う人が、コードレビュー中にテストを書くことは有益ではないでしょうか。 この質問では、これは純粋にアカデミックなプロジェクトであり、命にかかわることはないと想定しています。さらに、チームは4人です。誰もが言語を知っており、使用されるすべてのツール/ライブラリ/フレームワークに精通しており、テストを書くことができます。したがって、基本的には、上級のフルスタックではない人が忍者のエンジニアをリードしていますが、まともなコーダーです。 私が見つけた長所: レビュー中にコードのより深い理解を促し、意味のあるテストを作成します。 次に、テスト対象のコードの作成者が行ったテストのコードレビューを追加できます。 短所: コードの作成とテストの間のフィードバックループが拡大します。 編集:私はそれが「通常の」Webアプリケーションではうまく動作しないことを知っています。私が念頭に置いていたのは、細部に注意を払う必要のある複雑で科学的なアルゴリズムを実装するコーナーケースです。独自のグラフライブラリ、NLPなどの実装のようなものを想定しましょう。作成しているコードがデータベースから分離されているなど、理解するのが非常に難しいのは、ソースを理解する必要のある他の人ではありませんコードを作成し、意味のあるテストを行い、プロセス全体を、アプリケーションをクラッシュさせず、最終的に結果をゴミにするようなそれほど明白ではないバグを起こしにくくしますか?

3
非同期/待機デッドロックを診断するにはどうすればよいですか?
私はasync / awaitを多用する新しいコードベースで作業しています。私のチームのほとんどの人は、async / awaitにかなり慣れていません。私たちは一般的にMicrosoftによって指定されたベストプラクティスを保持する傾向がありますが、一般的には非同期呼び出しを通過するためにコンテキストが必要で、そうでないライブラリを使用していConfigureAwait(false)ます。 それらすべてを組み合わせて、毎週記事で説明されている非同期デッドロックに遭遇します。模擬テストされたデータソース(通常はを介してTask.FromResult)はデッドロックをトリガーするのに十分ではないため、ユニットテスト中には表示されません。そのため、実行時または統合テスト中に、一部のサービスコールは昼食に出て戻りません。それはサーバーを殺し、一般的に混乱をもたらします。 問題は、間違いがどこで発生したかを追跡すること(通常は完全に非同期ではないこと)には、通常、手作業のコード検査が含まれ、時間がかかり、自動化できないことです。 デッドロックの原因を診断するより良い方法は何ですか?
24 c#  debugging  async 

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