ソフトウェア工学

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

2
C#はネイティブC ++コンパイラとマージされますか?[閉まっている]
現在のところ、この質問はQ&A形式には適していません。回答は、事実、参考文献、または専門知識によってサポートされると予想されますが、この質問は、議論、議論、世論調査、または広範な議論を求める可能性があります。この質問を改善し、おそらく再開できると思われる場合は、ヘルプセンターをご覧ください。 7年前に閉鎖されました。 この投稿によると: http://channel9.msdn.com/Forums/Coffeehouse/MS-working-on-a-same-compiler-for-C-AND-C--Not-in-incubation-but-for-production- この投稿にはどの程度の真実がありますか?それは筋金入りのC ++プログラマー(ゲーム開発者など)によって真剣に受け止められるべきですか?? 編集:この質問には別の目的があります... C#はC ++と後方互換性がありますか?
23 c#  c++ 

2
同じことをする異なる関数シグネチャを提供することは良い考えですか?
以下は、3つの値で構成されるC ++クラスです。 class Foo{ //Constructor Foo(std::string, int, char); private: std::string foo; char bar; int baz; }; すべてのパラメータータイプは異なります。 順序が問題にならないように、コンストラクタをオーバーロードできます。 class Foo{ //Constructors Foo(std::string, char, int); Foo(std::string, int, char); Foo(char, int, std::string); Foo(char, std::string, int); Foo(int, std::string, char); Foo(int, char, std::string); private: std::string foo; char bar; int baz; }; しかし、それは良い考えですか? クラス/関数に必要なものがわかっていたので、それを始めました。 私はそれがそれらをどの順序で取ったかをいつも覚えていませんでした。 …



3
抽象構文ツリーの訪問者パターンの実装
私は自分のプログラミング言語を作成している最中で、それは学習目的のためにしています。私はすでに自分の言語のサブセット用にレクサーと再帰降下パーサーを作成しました(現在、などの数式をサポートし+ - * /ています)。パーサーは、抽象構文ツリーを返します。抽象ツリーでは、Evaluateメソッドを呼び出して式の結果を取得します。すべて正常に動作します。ほぼ私の現在の状況は次のとおりです(C#のコード例、これはほとんど言語に依存しません): public abstract class Node { public abstract Double Evaluate(); } public class OperationNode : Node { public Node Left { get; set; } private String Operator { get; set; } private Node Right { get; set; } public Double Evaluate() { if (Operator == "+") return …

5
「セッターなし」の世界での単体テスト
私は自分自身をDDDの専門家とは考えていませんが、ソリューションアーキテクトとして、可能な限りベストプラクティスを適用しようとしています。私は、DDDのノー(パブリック)セッター「スタイル」の賛否両論について多くの議論があることを知っており、議論の両側を見ることができます。私の問題は、スキル、知識、経験が非常に多様なチームで働いているということです。つまり、すべての開発者が「正しい」方法で作業することを信頼することはできません。たとえば、オブジェクトの内部状態の変更がメソッドによって実行されるがパブリックプロパティセッターを提供するようにドメインオブジェクトが設計されている場合、誰かがメソッドを呼び出す代わりにプロパティを設定することは避けられません。この例を使用します。 public class MyClass { public Boolean IsPublished { get { return PublishDate != null; } } public DateTime? PublishDate { get; set; } public void Publish() { if (IsPublished) throw new InvalidOperationException("Already published."); PublishDate = DateTime.Today; Raise(new PublishedEvent()); } } 私の解決策は、プロパティセッターをプライベートにすることです。これは、オブジェクトをハイドレートするために使用しているORMがリフレクションを使用してプライベートセッターにアクセスできるためです。ただし、単体テストを作成しようとすると問題が発生します。たとえば、再発行できないという要件を検証する単体テストを作成する場合、オブジェクトが既に発行されていることを示す必要があります。確かに2回Publishを呼び出すことでこれを行うことができますが、私のテストでは、最初の呼び出しでPublishが正しく実装されていると想定しています。それは少し臭いようです。 次のコードを使用して、シナリオをもう少し現実的にしましょう。 public class Document { public Document(String title) …

3
ベンダーのロックインを避けるためのチェックリスト?
ベンダーのロックインを回避するための一連の業界承認のルールはありますか? つまり、マネージャーや他の意思決定者に見せることができ、理解しやすく、検証しやすいものです。 客観的で測定可能な方法でベンダーのロックインを検出および防止するのに役立つ、広く受け入れられているルールのセット、チェックリストまたは条件のセットはありますか? プロジェクトの初期段階でベンダーがロックインするリスクについてマネージャーに警告しましたか?

5
安全なパスワード履歴を実装する方法
セキュリティ上の理由から、パスワードはプレーンテキストで保存しないでください。ハッシュを保存する必要があります。また、レインボーテーブル攻撃を防ぐために、ハッシュを慎重に生成する必要があります。 ただし、通常、最後のn個のパスワードを保存し、最小限の複雑さと異なるパスワード間の最小限の変更を強制する必要があります(ユーザーがPassword_1、Password_2、...、Password_ nのようなシーケンスを使用できないようにします)。これはプレーンテキストパスワードでは簡単ですが、ハッシュのみを保存することでどのようにできますか? つまり、安全なパスワード履歴メカニズムをどのように実装できるのでしょうか?

1
Haskell製品コードでseqはどのくらいの頻度で使用されますか?
Haskellで小さなツールを作成した経験があり、特にinteract標準入力を処理して標準出力にパイプするフィルター(を使用)を作成するために、非常に直感的に使用できます。 最近、通常の約10倍のサイズのファイルでこのようなフィルターを使用しようとしましたが、Stack space overflowエラーが発生しました。 いくつか読んだ後(こことここなど)、スタックスペースを節約するための2つのガイドラインを特定しました(経験のあるHaskellers、正しくないものを書いたら修正してください): 末尾再帰ではない再帰関数呼び出しは避けてください(これは末尾呼び出しの最適化をサポートするすべての関数型言語で有効です)。 seq式が縮小される前に大きくなりすぎないように、部分式の早期評価を強制的に導入します(これはHaskell、または少なくとも遅延評価を使用する言語に固有です)。 seqコードに5回または6回の呼び出しを導入した後、ツールは再びスムーズに実行されます(より大きなデータでも)。ただし、元のコードはもう少し読みやすいと思います。 私は経験豊富なHaskellプログラマーではないのでseq、この方法で紹介するのが一般的なプラクティスであるかどうか、またseqHaskellの製品コードで通常どのくらいの頻度で表示されるかを尋ねたいと思いました。または、seqあまり頻繁に使用することを避けながら、スタック領域をほとんど使用しないテクニックはありますか?

3
パフォーマンスを向上させるためにマルチスレッドがしばしば好まれているのはなぜですか?
この質問は、Software Engineering Stack Exchangeで回答できるため、Stack Overflowから移行されました。 6年前に移行され ました。 私は質問があります、それはプログラマーが一般的に並行性とマルチスレッドプログラムを好むように思われる理由についてです。 ここで2つの主なアプローチを検討しています。 基本的に信号に基づく非同期アプローチ、または新しいC#5.0などの多くの論文や言語で呼ばれる非同期アプローチ、およびパイプラインのポリシーを管理する「コンパニオンスレッド」 並行アプローチまたはマルチスレッドアプローチ 私はここでハードウェアと最悪のシナリオについて考えていると言いますが、この2つのパラダイムを自分でテストしました。物事をスピードアップしたり、リソースを有効に活用したい場合は、マルチスレッドについて話します。 CPU内にメモリコントローラーを提供しないIntelクアッドコアを備えた古いマシンでマルチスレッドプログラムと非同期プログラムをテストしました。メモリはマザーボードによって完全に管理されています。マルチスレッドアプリケーションでは、3-4-5のような比較的少数のスレッドでさえ問題になる可能性があり、アプリケーションは応答せず、遅くて不快です。 一方、優れた非同期アプローチはおそらく高速ではないかもしれませんが、最悪ではありません。私のアプリケーションは結果を待つだけでハングせず、応答性があり、はるかに優れたスケーリングが行われています。 また、スレッドの世界でのコンテキストの変更は、実際のシナリオではそれほど安くないことを発見しました。実際には、計算するために相互に循環してスワップする必要のあるスレッドが2つ以上ある場合、実際には非常に高価です。 現代のCPUでは、状況はそれほど違いはありませんが、統合されたメモリコントローラですが、私のポイントは、x86 CPUは基本的にシリアルマシンであり、メモリコントローラはマザーボード上の外部メモリコントローラを備えた古いマシンと同じように動作することです。コンテキストスイッチは依然としてアプリケーションに関連するコストであり、メモリコントローラーが統合されているか、新しいCPUに2コア以上あるという事実は私にとってはお買い得ではありません。 私が経験したコンカレントアプローチは理論的には良いが、実際にはそれほど良くありません。ハードウェアによってメモリモデルが課されているため、このパラダイムをうまく利用することは難しく、使用からデータ構造を複数のスレッドの結合に使用します。 また、両方のパラダイムは、特定の時点でタスクまたはジョブが実行されるときにセキュリティを提供しません。機能的な観点からは、それらは本当に似ています。 X86メモリモデルによると、なぜ大多数の人々は、非同期アプローチではなく、C ++で同時実行性を使用することを提案するのでしょうか。また、コンピュータの最悪のシナリオを考えてみてください。コンテキストスイッチは、おそらく計算自体よりも高価です。

5
Gitユーザーは、Subversionにはすべてのソースコードがローカルに存在しないと言うのはなぜですか?
私はSOで読んだことだけを続けるので、許してくれますが、Subversionに対するGitの主な利点の1つは、Gitがすべてのソースコードをローカルで開発者に提供することであり、サーバー。 SVNとTortoiseSVNの使用が制限されているため、すべてのソースコードを入手できました。たとえば、私はウェブサイトを持っています。SVNにアップロードします。私はまだ自分のウェブサイトをローカルで実行していますよね?誰かが変更を送信し、接続していない場合は、サーバーに再接続するまで、Gitを使用しているかどうかは関係ありません。 わかりません。この1つの点を除いて、一方と他方の再ハッシュを要求していません。
23 git  svn 

5
バグ追跡エチケット-ネクロマンシーまたは重複?
要求された拡張を行うために必要なツールが不足しているため、「解決済み(修正しない)」とマークされたオープンソースプロジェクトのバグトラッカーで、非常に古い(2年以上)機能要求の問題に遭遇しました。その決定がなされてから経過した時間の中で、それを解決することを可能にする新しいツールが開発されました、そして、私はそのアプリケーションのためにコミュニティの注意を喚起したいと思います。 ただし、このような場合に一般的に受け入れられているエチケットがバグ追跡のためのものであるかどうかはわかりません。明らかに、システムが複製しないことを明示的に宣言し、新しいアイテムを複製としてアクティブにマークする場合(SEサイトの場合と同様)、答えはシステムが言うことに従うことです。しかし、システムが明示的にそれを言っていない場合、または新しいユーザーがシステムの好みで言う場所を簡単に見つけることができない場合はどうですか?一般に、複製または壊死の側で誤りを犯す方が良いと考えられますか?これはバグか機能リクエストかによって異なりますか?

3
「必要に応じてXを実行」メソッドの命名
Xを実行する必要があるかどうかをチェックし、必要に応じてXを実行するメソッドに名前を付ける良い方法は何ですか? たとえば、新しいユーザーがログインした場合にユーザーリストを更新するメソッドに名前を付ける方法は?UpdateListIfNeeded長すぎるように見えますが、単純なUpdateListことは、毎回高価で不必要な操作が行われることを意味します。EnsureListUpdatedバリアントでもあります。 C#には、Xが可能かどうかを確認して実行するbool TryXXX(args, out result)パターン(たとえばint.TryParse(str, out num))がありますが、それは微妙に異なります。

6
UMLクラス図はJavaScriptシステムの設計に適していますか?
UMLがオブジェクト指向へのより古典的なアプローチを指向していることを考えると、JavaScriptシステムを設計するための信頼できる方法でまだ使用可能ですか? 私が見ることができる特定の問題の1つは、実際にはクラス図がシステムの構造図であり、JavaScriptがより多くの動作駆動型であるということです。どうすれば対処できますか? ここでは、現実世界のドメインについては話していないことに注意してください。私が達成しようとしているソリューションのモデルです。

5
成功:/失敗:ブロックvs完了:ブロック
Objective-Cのブロックには2つの一般的なパターンがあります。1つはsuccess:/ failure:ブロックのペアであり、もう1つは単一のcompletion:ブロックです。 たとえば、非同期でオブジェクトを返すタスクがあり、そのタスクが失敗する可能性があるとしましょう。最初のパターンは-taskWithSuccess:(void (^)(id object))success failure:(void (^)(NSError *error))failureです。2番目のパターンは-taskWithCompletion:(void (^)(id object, NSError *error))completionです。 成功:/失敗: [target taskWithSuccess:^(id object) { // W00t! I've got my object } failure:^(NSError *error) { // Oh noes! report the failure. }]; 完了: [target taskWithCompletion:^(id object, NSError *error) { if (object) { // W00t! I've got my object …

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