タグ付けされた質問 「architecture」

ソフトウェアシステムの高レベルの設計と説明。アーキテクチャ設計では、実装、アルゴリズム、およびデータ表現の詳細を抽出して、「ブラックボックス」コンポーネントの相互作用に集中します。

30
独自のプログラミング言語とそのコンパイラを作成するにはどうすればよいですか[非公開]
私はプログラミングに精通しており、BASIC、FORTRAN、COBOL、LISP、LOGO、Java、C ++、C、MATLAB、Mathematica、Python、Ruby、Perl、JavaScript、アセンブリなどの言語に出会いました。人々がプログラミング言語を作成し、そのためのコンパイラを考案する方法を理解できません。また、Windows、Mac、UNIX、DOSなどのOSを人々がどのように作成するのかも理解できませんでした。私にとって不思議なもう1つのことは、人々がOpenGL、OpenCL、OpenCV、Cocoa、MFCなどのライブラリを作成する方法です。最後に理解できないのは、科学者がマイクロプロセッサ用のアセンブリ言語とアセンブラをどのように考案したかです。私はこれらすべてを本当に学びたいです。私は15歳です。私は常に、バベッジ、チューリング、シャノン、デニスリッチーなどのコンピューター科学者になりたいと思っていました。 私はすでにAhoのCompiler DesignとTanenbaumのOSコンセプトの本を読んでおり、それらはすべてコンセプトとコードを高レベルでしか議論していません。彼らは詳細やニュアンス、そしてコンパイラやオペレーティングシステムの考案方法には触れません。スレッド、セマフォ、プロセス、または解析とは何かを理解するだけでなく、自分で作成できるように具体的な理解が必要です。私は兄にこれについてすべて尋ねました。彼はMITのEECSのSBの学生であり、現実の世界でこれらすべてのものを実際に作成する方法の手がかりを持っていません。彼が知っているのは、皆さんが言及したようなコンパイラー設計とOSの概念(スレッド、同期、並行性、メモリー管理、字句解析、中間コード生成など)の理解だけです

17
早すぎる最適化は本当にすべての悪の根源ですか?
私の同僚は今日、と呼ばれるクラスをコミットしましたThreadLocalFormat。これは基本的にJava Formatクラスのインスタンスをスレッドローカルに移動します。これらはスレッドセーフではなく、作成するには「比較的高価」です。簡単なテストを作成し、1秒間に200,000個のインスタンスを作成できると計算し、その数を作成するように彼に尋ねました。彼は優れたプログラマーであり、チームの全員が高度なスキルを持っているため、結果のコードを理解するのに問題はありませんが、実際に必要のない場所を最適化する場合でした。彼は私のリクエストに応じてコードをバックアウトしました。どう思いますか?これは「時期尚早な最適化」のケースですか?それは実際にどれほど悪いですか?

16
単一責任原則を使用する場合、「責任」とは何ですか?
「単一責任の原則」が「1つのことだけを行う」ことを意味するものではないことは明らかです。それがメソッドの目的です。 public Interface CustomerCRUD { public void Create(Customer customer); public Customer Read(int CustomerID); public void Update(Customer customer); public void Delete(int CustomerID); } ボブ・マーティンは、「クラスには変更する理由が1つだけあるべきだ」と言っています。しかし、SOLIDを初めて使用するプログラマーの場合、これを考えるのは困難です。 私は別の質問への回答を書きました。そこでは、職責は役職のようなものであると提案し、レストランのメタファーを使って私の論点を説明することで主題について踊りました。しかし、それでも、クラスの責任を定義するために誰かが使用できる一連の原則は明確にされていません。 それでどうやってやるの?各クラスが持つべき責任をどのように決定し、SRPのコンテキストで責任をどのように定義しますか?


17
戻り値が存在しない関数/メソッドからNULLまたは空の値を返す方が良いですか?
ここで推奨事項を探しています。戻り値が存在しないか判断できない場合に、メソッドからNULLまたは空の値を返す方が良いかどうかに苦労しています。 例として、次の2つの方法を使用します。 string ReverseString(string stringToReverse) // takes a string and reverses it. Person FindPerson(int personID) // finds a Person with a matching personID. ではReverseString()、戻り値の型が文字列であるため、呼び出し側はそれを期待しているため、空の文字列を返します。また、この方法では、呼び出し元はNULLが返されたかどうかを確認する必要がありません。 でFindPerson()、NULLを返す方が適切なようです。NULLまたは空のPersonオブジェクト(new Person())が返されるかどうかに関係なく、呼び出し側は、何かを行う前に(呼び出しなどUpdateName())PersonオブジェクトがNULLまたは空であるかどうかを確認する必要があります。ここでNULLを返すだけで、呼び出し側はNULLをチェックするだけでよいのはなぜですか。 他の誰かがこれに苦労していますか?どんな助けや洞察も大歓迎です。

9
多重継承が嫌われる「本当の」理由はありますか?
私は常に、言語で複数の継承をサポートするというアイデアが好きでした。ほとんどの場合、意図的に無視されますが、想定される「置換」はインターフェースです。インターフェースは、多重継承が行うものと同じ基盤をすべてカバーするものではなく、この制限により、定型コードが増える場合があります。 私がこれまでに聞いた唯一の基本的な理由は、基本クラスのダイヤモンドの問題です。私はそれを受け入れることができません。私にとっては、「まあ、それを台無しにすることは可能だから、それは自動的に悪い考えだ」というようなひどい結果になります。ただし、プログラミング言語で何かを台無しにすることができます、と私は何を意味します。少なくとももっと徹底的な説明がなければ、私はこれを真剣に受け止めることはできません。 この問題を知っているだけで、戦いの90%になります。さらに、私は何年か前に「エンベロープ」アルゴリズムまたはそのようなものを含む汎用的な回避策について聞いたことがあると思います(これは鐘を鳴らしますか?)。 ダイヤモンドの問題に関して、私が考えることができる唯一の潜在的に本物の問題は、サードパーティのライブラリを使用しようとしており、そのライブラリ内の2つの一見無関係なクラスが共通の基本クラスを持っていることを見ることができない場合ですが、ドキュメンテーション、単純な言語機能では、たとえば、実際にコンパイルする前に、ダイヤモンドを作成する意図を明確に宣言する必要があります。このような機能を使用すると、ダイヤモンドの作成は意図的、無謀、またはこの落とし穴に気付かないためです。 すべてが言われているように...あらゆるあり、実際のほとんどの人は多重継承を憎む理由は、またはそれが良いよりも害の原因とヒステリーのすべてのちょうど束でありますか?ここにないものがありますか?ありがとうございました。 例 車はWheeledVehicleを拡張し、KIASpectraはCarとElectronicを拡張し、KIASpectraはラジオを含みます。KIASpectraにElectronicが含まれないのはなぜですか? それは電子だからです。継承と構成は、常にis-a関係とhas-a関係でなければなりません。 それは電子だからです。配線、回路基板、スイッチなどがあります。 それは電子だからです。冬にバッテリーが切れると、すべてのホイールが突然なくなったのと同じくらいのトラブルに見舞われます。 インターフェースを使用しないのはなぜですか?たとえば、#3を考えてみましょう。私はこれを何度も何度も書きたくないし、これを行うために奇妙なプロキシヘルパークラスを本当に作りたくない: private void runOrDont() { if (this.battery) { if (this.battery.working && this.switchedOn) { this.run(); return; } } this.dontRun(); } (その実装が良いか悪いかについては触れていません。)WheeledVehicleの何にも関連せず、Electronicに関連するこれらの機能のいくつかがどのように存在するか想像できます。 そこには解釈の余地があるので、その例に落ち着くかどうかはわかりませんでした。また、VehicleとFlyingObjectを拡張するPlaneや、AnimalとFlyingObjectを拡張するBirdの観点、またはより純粋な例の観点から考えることもできます。

8
依存性注入の批判と欠点
依存性注入(DI)は、よく知られた流行のパターンです。ほとんどのエンジニアは、次のような利点を知っています。 単体テストの分離を可能/簡単にする クラスの依存関係を明示的に定義する 優れた設計の促進(たとえば、単一責任原則(SRP)) すばやく切り替え実装を可能にする(DbLogger代わりにConsoleLogger例えば) DIは良い、有用なパターンであるという業界全体のコンセンサスがあると思います。現時点ではあまり批判はありません。コミュニティで言及されている欠点は、通常は軽微です。それらのいくつか: クラスの数が増えました 不要なインターフェイスの作成 現在、同僚とアーキテクチャ設計について話し合っています。彼はかなり保守的ですが、心を開いています。ITの多くの人々は最新のトレンドをコピーし、利点を繰り返し、一般的にはあまり考えすぎないため、あまり深く分析しないでください。 お願いしたいことは: 実装が1つしかない場合、依存性注入を使用する必要がありますか? 言語/フレームワーク以外の新しいオブジェクトの作成を禁止すべきですか? 特定のクラスの単体テストを計画しない場合、単一の実装をインジェクトするのは悪い考えです(実装が1つしかないため、「空の」インターフェースを作成したくないとしましょう)。

10
C#で「静的」を使用しないでください
コードレビューのために、他のアーキテクトに書いた申請書を提出しました。そのうちの1人はすぐに返事を書き、「「静的」を使用しないでください。静的クラスと静的メソッドを使用して自動テストを作成することはできません。「静的」は避ける必要があります。」 チェックして、クラスの1/4が完全に「静的」とマークされています。クラスはコード全体で使用される単一のグローバルクラスであるため、クラスのインスタンスを作成しない場合は静的を使用します。 彼は、静的コードでは使用できないモック、IOC / DIテクニックを含むものについて言及し続けました。彼は、サードパーティのライブラリがテスト不能であるために静的である場合、それは残念だと言います。 この他の建築家は正しいですか? 更新:ここに例があります: APIManager-このクラスは、次に許可される時間とともに呼び出しているサードパーティAPIの辞書を保持します。多くのサードパーティが利用規約で持っているAPIの使用制限を強制します。Thread.Sleep(APIManager.GetWait( "ProviderXYZ"))を呼び出して、サードパーティサービスを呼び出す場所で使用します。電話をかける前に。ここにあるものはすべてスレッドセーフであり、C#のTPLでうまく機能します。

5
C#でのasync / awaitの使用のガイドラインは、優れたアーキテクチャと抽象化レイヤーの概念と矛盾していませんか?
この質問はC#言語に関するものですが、JavaやTypeScriptなどの他の言語をカバーするものと期待しています。 Microsoft は、.NETで非同期呼び出しを使用する場合のベストプラクティスを推奨しています。これらの推奨事項のうち、2つを選択しましょう。 TaskまたはTask <>を返すように非同期メソッドのシグネチャを変更します(TypeScriptでは、Promise <>になります) 非同期メソッドの名前をxxxAsync()で終わるように変更します 現在、低レベルの同期コンポーネントを非同期コンポーネントに置き換えると、これはアプリケーションのフルスタックに影響します。async / awaitは「最後まで」使用した場合にのみプラスの影響を与えるため、アプリケーション内のすべてのレイヤーのシグネチャとメソッド名を変更する必要があることを意味します。 優れたアーキテクチャでは、各レイヤーの間に抽象化を配置することが多く、低レベルのコンポーネントを他のコンポーネントに置き換えることは、上位レベルのコンポーネントには見えません。C#では、抽象化はインターフェイスの形式を取ります。新しい低レベルの非同期コンポーネントを導入する場合、コールスタック内の各インターフェイスを変更するか、新しいインターフェイスに置き換える必要があります。実装クラスで問題が解決される方法(非同期または同期)は、呼び出し元には隠されません(抽象化されません)。呼び出し元は、同期か非同期かを知る必要があります。 「良いアーキテクチャ」の原則と矛盾するベストプラクティスを非同期/待機しませんか? 非同期依存関係に切り替えるときにスタック内で置き換えることができるように、各インターフェイス(IEnumerable、IDataAccessLayerなど)が非同期の対応物(IAsyncEnumerable、IAsyncDataAccessLayer)を必要とするということですか? 問題をもう少し進めると、すべてのメソッドが非同期(Task <>またはPromise <>を返す)であると仮定し、メソッドが実際に非同期呼び出しを同期しないようにする方が簡単ではないでしょうか非同期?これは将来のプログラミング言語から期待されるものですか?
103 c#  architecture  async 

9
なぜ依存性注入を使用する必要があるのですか?
依存性注入を使用する理由についてリソースを探すのに苦労しています。私が見るほとんどのリソースは、オブジェクトのインスタンスをオブジェクトの別のインスタンスに渡すだけであると説明していますが、なぜですか?これはアーキテクチャ/コードをきれいにするためだけですか、それとも全体としてパフォーマンスに影響しますか? なぜ次のことを行う必要があるのですか? class Profile { public function deactivateProfile(Setting $setting) { $setting->isActive = false; } } 次の代わりに? class Profile { public function deactivateProfile() { $setting = new Setting(); $setting->isActive = false; } }

17
ユーザーインターフェイスクラスをコマンドラインインターフェイスに置き換えることができると考えるアーキテクチャを設計することは良い考えですか?
コード完了ページ25では、通常のユーザーインターフェイスクラスをコマンドラインクラスで簡単に置き換えることができるとよいと言われています。 テストの利点を知っていて、それがもたらす問題についてはどうでしょうか? この余分な作業は、Webプロジェクトとモバイルプロジェクトにとって本当に成果がありますか?中小規模のプロジェクトはどうですか。同じルールが適用されますか?設計がより複雑になる場合はどうしますか?

10
アラン・ケイが「インターネットはとてもよくできていたが、ウェブはアマチュアによるものだった」と言ったのはなぜですか?
OK、だから私は言い換えました。完全な引用: インターネットは非常によくできていたため、ほとんどの人は人工的なものではなく、太平洋のような自然資源と考えています。そのような規模のテクノロジーが最後にエラーになったのはいつですか?それに比べて、ウェブは冗談です。ウェブはアマチュアによって行われました。-アラン・ケイ。 私はインターネットとウェブの歴史を理解しようとしていますが、この声明は理解するのが難しいです。インターネットは現在、設計されたものとは非常に異なるものに使用されていることを他の場所で読んだことがあります。 何がインターネットをこれほど良くし、何がウェブをこれほどアマチュアにしているのでしょうか? (もちろん、アラン・ケイは間違いがあり、ここにいる人は誰もいないので、なぜ彼がそれを言ったのか正確に知ることはできませんが、可能な説明は何ですか?) * 元のインタビューも参照してください*。

9
「クリーンコード」の実践からはほど遠いコードを使用しながら、巨大なオープンソースライブラリをどのように維持しますか。
私はまだ高品質のコードを書くには経験が浅いので、Robert C. MartinによるClean Codeなどの問題に対処する本を読み、よく知られているライブラリのコードをチェックしてスキルを向上させます。 多くのオープンソースライブラリは長年にわたって維持されていますが、正しいパスにないことはほとんどありませんが、それらの多くのコードは、クリーンなコードを記述するための原則からはほど遠いことがわかりました。数百行のコード。 だから私の質問は次のとおりです。きれいなコードの原則はあまりにも制限されていますか?そうでない場合、これらの原則の多くを考慮せずに巨大なライブラリをどのように維持していますか? 簡単な説明をいただければ幸いです。質問が初心者の人からばかげていると思われる場合、私は謝罪します。 編集 Butterknifeライブラリでこの例を確認してください。Androidコミュニティで最もよく知られているライブラリの1つです。

7
マイクロサービスで最も受け入れられているトランザクション戦略は何ですか
マイクロサービスを備えたシステムで発生した主要な問題の1つは、トランザクションが異なるサービスにまたがる場合のトランザクションの動作方法です。独自のアーキテクチャ内では、これを解決するために分散トランザクションを使用してきましたが、独自の問題があります。特にこれまでのところ、デッドロックは苦痛です。 別のオプションは、システム内のフローを認識し、システム全体にまたがるバックグラウンドプロセスとしてロールバックを処理する、カスタムメイドのトランザクションマネージャーのようです(他のサービスにロールバックするよう指示します)ダウンしている場合は、後で通知します)。 別の受け入れられるオプションはありますか?これらの両方に欠点があるようです。最初のものはデッドロックやその他の問題を引き起こし、2番目のものはデータの不整合を引き起こす可能性があります。より良いオプションはありますか?

17
「賢い」コードを書かないように自分を訓練する方法は?[閉まっている]
s で新しいトリックを披露したり、3つの異なる手順を一般化したりする必要があるときの気持ちを知っていExpressionますか?これはArchitecture Astronautの規模である必要はなく、実際に役立つかもしれませんが、他の誰かが同じクラスまたはパッケージをより明確で率直な(そして時には退屈な)方法で実装することに気づかずにはいられません。 私はしばしば問題を過剰に解決することによってプログラムを設計することに気づきました。時には故意に、時には退屈から。どちらの場合でも、反対の証拠を見るまで、私のソリューションは非常に透明でエレガントであると正直に信じていますが、通常は手遅れです。また、コードの重複よりも文書化されていない仮定を好み、単純さよりも賢いことを好む私もいます。 何をするために行うことができ、「cleverish」のコードを記述する衝動に抵抗してたときにベルリングをすべきであること、私はそれは間違ってやっていますか? 私は今、経験豊富な開発者のチームと協力しているため、問題はさらに押し進められています。スマートコードを書くという私の試みは、時間が優雅さの幻想を払拭した後でも自分にとっては愚かに思えます。

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