ソフトウェア工学

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

1
ASCIIテーブルの句読点が至る所にあるのはなぜですか?
ではASCIIテーブル、句読点は(非印字文字の間や数字の前に表示される!"#$%&')*+,-./数字と大文字(間、) :;<=>?@)、大文字(間[\]^_`)と小文字の文字、小文字(後{|}~)。 一見すると、これらが一緒にグループ化されることが期待されます。すべての英数字の前または後ろにある可能性があります。しかし、これは事実ではありません。それらはこれらの異なるグループに広がっています。 これはなぜですか?キャラクターがこのようにグループ化される理由はいくつかあります(歴史的な可能性がある)。
13 strings  ascii 

3
インターフェイスを含むシミュレーションのこのOOP設計は悪いですか?
私は吸血鬼、オオカミ、人間、トラックをシミュレートするために自分の小さなOOPプログラムを設計しており、インターフェイスに関する私自身の限られた理解を実装しようとしています。 (私はまだここで抽象化しており、まだコードの実装がないので、OOP設計の問題です...私は思う!) これらのクラス間の「共通の振る舞い」を探して、インターフェースとして実装するのは正しいですか? たとえば、ヴァンパイアとオオカミの噛みつき...噛み付きのインターフェースが必要ですか? public class Vampire : Villain, IBite, IMove, IAttack トラックについても同様です... public class Truck : Vehicle, IMove そして人間のために... public class Man : Human, IMove, IDead 私の考えはここにありますか?(あなたの助けに感謝)

4
関数の引数の数を最小化する手法
クリーンコードでは、「関数の引数の理想的な数はゼロ」と書かれています。理由は説明されており、理にかなっています。私が望んでいるのは、この問題を解決するために4つ以上の引数を持つメソッドをリファクタリングする手法です。 1つの方法は、引数を新しいクラスに抽出することですが、それは確かにクラスの爆発につながりますか?そして、それらのクラスは、いくつかの命名規則に違反する名前で終わる可能性が高い(「データ」または「情報」などで終わる)? 別の手法は、複数の関数で使用される変数をプライベートメンバー変数にして、それらを渡さないようにすることですが、変数のスコープを拡張し、おそらく実際にそれを必要としない関数に対して開かれるようにします。 関数の引数を最小化する方法を探し、それを行うのが良い考えである理由を受け入れました。

3
CSSが単一行コメントを許可しないのはなぜですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 閉じた3年前。 CSSはそのような複数行コメントのみをサポートすることを理解しています /* foobar */ 単一行コメントのサポートがないのはなぜですか。 // foobar それらはプログラミングでも同じように一般的であり、CSSのような各ルールが独自の行にある言語の場合に特に役立つようです。 この決定に特定の歴史的理由がなかった場合、ブラウザがそれをサポートすることを妨げているのは何ですか?
13 css  css3 

5
静的メソッドをオーバーライドできないのはなぜですか?
この質問への回答で、一般的なコンセンサスは、静的メソッドはオーバーライドされることを意図していないということでした(したがって、C#の静的関数は仮想または抽象にできません)。ただし、これはC#の場合だけではありません。Javaもこれを禁止しており、C ++もそれを好まないようです。ただし、子クラスでオーバーライドしたい静的関数(ファクトリーメソッドなど)の多くの例を考えることができます。理論的には、それらを回避する方法がありますが、それらはどれもきれいでも単純でもありません。 静的関数をオーバーライドできないのはなぜですか?

3
ブロッキングストリームをTCP接続に多重化することをお勧めしますか?
2つのホスト間に複数の二重チャネルが必要です。1つのTCP接続のみを確立することには多くの利点があります。しかし、多重化は避けられない問題を引き起こすとは思いません。パフォーマンスを低下させたり、レイテンシを大幅に増加させたりしませんか?また、メモリ使用量とCPU使用量はどうですか?何か提案や警告がありますか?

5
クロスプラットフォームの互換性(C ++)を確保するためのテクニック?
(フレームワークによれば)クロスプラットフォームであると想定されている、初期のC ++プロジェクトの1つを終えていました。ライブラリはすべてクロスプラットフォームであるため、OSXビルドを「後で」実行するのは簡単だと思い、プロジェクトをWindowsとVisual Studioで完全に開発しました。これは事実ではないことが判明しましたが、「Windowsコード」が正しく実行されず、修正すべきコンパイルエラーがいくつかありました。 コードがすべてのプラットフォームと互換性があることを事前に保証するために、どのような手法が存在しますか?すべてのプラットフォームを同時に開発し、新しいプラットフォームバージョンを次々に開発するのではなく、新しい機能が追加されたときに、すべてのプラットフォームに対して同時にコードをテストしますか?(*) ツールに依存するのではなく、使用するツールに関係なく、クロスプラットフォームの互換性を支援する「開発プロセス」ではなく、具体的にアドバイスを探します。上記の(*)のように。 具体的には、WDL-OL(https://github.com/olilarkin/wdl-ol)といくつかのクロスプラットフォームDSPライブラリを使用してVSTプラグインを開発しています。WDL-OLプロジェクトにはVSプロジェクトとXcodeプロジェクトの両方がセットアップされていますが、問題はライブラリーに起因し、コンパイラーの違いに起因すると推測します。

5
デメテルの法則によれば、クラスはそのメンバーの1人を返すことを許可されていますか?
デメテルの法則に関して3つの質問があります。 別に特にリターンオブジェクトに任命されたクラスから-などの工場やビルダークラスなど-それは、例えば、クラスのプロパティの1つが保持しているか、それが違反するオブジェクト、オブジェクトを返すメソッドのために大丈夫ですデメテルの法則(1) ?そして、それがデメテルの法則に違反する場合、返されるオブジェクトがデータの一部を表し、このデータのゲッターのみを含む不変オブジェクトであるかどうかは問題になりますか?または、そのようなValueObjectはそれ自体がアンチパターンですか?そのクラスのデータで行われていることはすべてクラスの外部で行われているためです(2b)? 擬似コードで: class A {} class B { private A a; public A getA() { return this.a; } } class C { private B b; private X x; public void main() { // Is it okay for B.getA to exist? A a = this.b.getA(); a.doSomething(); x.doSomethingElse(a); } } …

4
C構造体は、関数を持っているように動作できますか?
struct構造体がメンバーを持つことはできますが、関数を持つことはできないCとs を使用します。簡単にするために、名前を付けた文字列の構造体を作成し、文字列のインデックスと位置の文字を置き換える文字をどこでstrできるようにするかを想定します。構造体は関数を持たないか、この動作を実装し、構造体が実際に構造体だけが新しい構造体にコピーして更新する(単純な)関数を持つことができることを模倣する方法がまだあるので、これは決して不可能でしょうか?それができるフィールド?str.replace(int i, char c)ici したがってreplace、アクセスされたときなどに更新される新しい構造体を指す構造体の3番目のメンバーである可能性があります。できますか?それとも、私の意図を妨げる組み込みのものや、何らかの理論やパラダイムがありますか? 背景は、私がCコードを書いていることであり、OOP言語のライブラリビルトインであることがわかっている関数を再発明し、OOPは文字列とコマンドを操作する良い方法だと思います。

2
注入できないコードをテストする方法は?
そのため、システム全体で次のコードを使用しています。現在、ユニットテストを過去にさかのぼって記述しています(私の議論ではなかったよりも遅くなっています)が、これがどのようにテスト可能かはわかりませんか? public function validate($value, Constraint $constraint) { $searchEntity = EmailAlertToSearchAdapter::adapt($value); $queryBuilder = SearcherFactory::getSearchDirector($searchEntity->getKeywords()); $adapter = new SearchEntityToQueryAdapter($queryBuilder, $searchEntity); $query = $adapter->setupBuilder()->build(); $totalCount = $this->advertType->count($query); if ($totalCount >= self::MAXIMUM_MATCHING_ADS) { $this->context->addViolation( $constraint->message ); } } 概念的には、これはどの言語にも適用できるはずですが、私はPHPを使用しています。このコードは、オブジェクトに基づいてElasticSearchクエリオブジェクトを構築するだけで、Searchオブジェクトはオブジェクトから構築されEmailAlertます。これらSearchとEmailAlert'sは単なるPOPOです。 私の問題は、SearcherFactory(静的メソッドを使用する)をモックアウトする方法や、インスタンスSearchEntityToQueryAdapterからの結果を必要とするをモックアウトできないことです。メソッド内の結果から構築されたものを注入するにはどうすればよいですか?たぶん私が知らないいくつかのデザインパターンがありますか?SearcherFactory::getSearchDirector Search 助けてくれてありがとう!

3
CDNフォールバック用のローカルJSおよびCSSリソースの提供
とすれば CDNは、良いこと、彼らが近いクライアントにリソースを提供することができますので、クライアントはそれらをキャッシュすることができ、あなたは、あなた自身のサーバーの負荷を軽減することができます。 最近のブラウザでは、サブリソースの整合性(SRI)のおかげで、サードパーティのサーバーからリソースをロードしてもセキュリティが低下しません。 国によってはCDNがダウンまたはブロックされている場合があり、オフラインでの開発時には利用できません1。 CDNを使用するだけでなく、CDNを使用できないように準備することも魅力的だと思います。このブログ投稿では、フォールバックを提供するためのさまざまなアプローチを紹介しています。Basicの例を見ると、jQueryとBootstrapだけにフォールバックを提供するためのかなり多くの定型コードが既に含まれていることがわかりますが、好まれたソリューションはFallback.jsの使用を提案しています。 。同様に、トピックに最も関連するSOの質問は、jQueryのフォールバックを提供することだけです。 ただし、ほとんどの実際のプロジェクトでは、5つ以上のjs / cssリソースがあると予想されるため、それらすべてのフォールバックを提供するために厄介なボイラープレートを繰り返す必要はないはずです。さらに、リソースを追加または更新するたびに、次のことを行う必要があります。 CDNリンクを更新する 手動でダウンロードするか、npm / bower configのバージョンを変更して、ローカルフォールバックコピーを更新します フォールバックへのリンクを更新します SRIハッシュを更新する 一方、Ideal Worldでは、1つの構成ファイルでリソースを追加/更新し、他のすべてのステップを自動的に実行します(そして、更新が何かを壊すかどうかを確認するテストを実行します)。 これを達成するための確立されたワークフローは既にありますか? それとも、CDN、特にSRIはまだ新しいのですか? または、ほとんどの人は単にCDNリソースのフォールバックを提供することを気にしませんか? 1. CDNに依存しないdevビルドを作成することもできますが、これもフォールバックの一種であると考えています。
13 javascript  css  cdn 

2
多くのusing / importステートメントがあるのは、デザインやコードの悪臭を示していますか?
通常、クラスファイルの先頭にいくつかのusingステートメントが表示されます。例: using System.Collections.Generic; using System.IO; using System.Xml.Linq; しかし、私が取り組んでいるプロジェクトでは、いくつかの機会に、1つのクラスファイルで20以上の使用/インポートが見られます。これは悪いデザインですか?1つのことを行うために設計されたクラスは、少数のコンポーネントにのみ依存する必要があるようです。

5
定義された役割を持つチームでスクラムを機能させる方法は?
いくつかの背景情報 私は社内のソフトウェア開発チームの一員です。で構成されます 5人の開発者(2〜5年の経験があり、私もその1人です) 3人の実装スタッフ(ソフトウェアの展開とトレーニングを行います) および1人のプロジェクトマネージャー。 多くの小規模から中規模のプロジェクトを開発しており、それらのスケジュールは通常重複しています。開発は次のようになります。 「クライアント」は一連の初期要件を提供します 上記の仕様に合わせてシステムを開発します システムを「クライアント」に提示する 「クライアント」は、上記のプレゼンテーションに基づいて追加の要件を提供します 「クライアント」の新しい要件がなくなるか、展開の対象日が近づくまで2〜4を繰り返します システムをセットアップして展開する これは、ほとんどの場合、期限を処理する「クライアント」であるという事実(これはプログラマーとPM.SEで私が見ているものからの赤旗です)であり、明確な開発方法論に従っていませんカウボーイコーディング、メンテナンス不可能なコード、本番環境を通過するバグなどが含まれます。それが、スクラムのようなアジャイルベースの方法論を採用することを選んだ理由です。 なぜスクラムなのか? それは私たちのマネージャーのイニシアチブであり、現在の状況を考えると誰もがそれに同意するようです。 スクラムの問題 スクラムの一部の要素は、特にアジャイル開発者の「すべての取引」という性質に簡単に対処できない現在のセットアップと競合しています。展開チームはプログラミングの方法を知らず、開発者は平均以下のコミュニケーションとトレーニングのスキルを持っています。そして、このラインナップはすぐに変わることはありません。 質問 方法論としてのスクラムの有効性に影響しますか?補償するために他の変更を行う必要がありますか?それとも、考えを完全に捨てて、別の方法論について考える方が良いでしょうか?

4
IDEが非常に賢い場合、「clone()」をキャストする必要があるのはなぜですか?
コードを入力している間、IDE(NetBeans)タイプがチェックしCollectionsます。しかし、その後、返されたオブジェクトをキャストする必要があるのはなぜObject.clone()ですか?大丈夫です。害もファウルもありません。しかし、それでも理解できません。 型チェックは、キャストせずに、返されたオブジェクトをObject.clone()不可能ですか?ジェネリックフレームワークは、私はIDEがチェックできると思いますタイプ「の右側のオブジェクト参照の=私はタイピングをしていながら、キャストなし」マークを?わかりません。 補遺 私の使用例は、私がプライベートCalendarフィールドpubdateを持っていたことだけでした。私は書くつもりでした: Calendar getPubdate() { return pubdate; } しかし、呼び出し側がpubdateを変更する可能性があるため、コピーを返しました。 Calendar getPubdate() { return (Calendar) pubdate.clone(); } 次に、なぜキャストする必要があるのか​​疑問に思いましたpubdate.clone()。メソッドシグニチャにはタイプがあります。NetBeansはそれを理解できるはずです。そしてNetBeansはに関して同様のことをしているようCollectionsでした。

1
オブジェクトライフタイム不変式と移動セマンティクス
ずっと前にC ++を学んだとき、C ++のポイントの一部は、ループに「ループ不変式」があるように、クラスにもオブジェクトの存続期間に関連する不変式があることを強く強調しました。オブジェクトが生きている限り。コンストラクターによって確立され、メソッドによって保持されるべきもの。カプセル化/アクセス制御は、不変条件を強制するのに役立ちます。RAIIは、このアイデアでできることの1つです。 C ++ 11以降、ムーブセマンティクスがあります。移動をサポートするクラスの場合、オブジェクトからの移動はその寿命を正式に終了することはありません-移動は「有効な」状態のままにすることになっています。 クラスの設計において、クラスの不変式が移動元までしか保持されないように設計するのは悪い習慣ですか?または、高速化できるようになれば大丈夫です。 具体的にするために、コピー不可だが移動可能なリソースタイプがあるとします。 class opaque { opaque(const opaque &) = delete; public: opaque(opaque &&); ... void mysterious(); void mysterious(int); void mysterious(std::vector<std::string>); }; そして、何らかの理由で、おそらく既存のディスパッチシステムで使用できるように、このオブジェクトのコピー可能なラッパーを作成する必要があります。 class copyable_opaque { std::shared_ptr<opaque> o_; copyable_opaque() = delete; public: explicit copyable_opaque(opaque _o) : o_(std::make_shared<opaque>(std::move(_o))) {} void operator()() { o_->mysterious(); } void operator()(int …

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