質問

書いモータコントローラーのカップルインタフェース(ボタン、Bluetooth、触覚のノブはタスクは着実に成長する大きっかけになるかもしれないと.たって行っている低レベルのモジュール例コードを書いはI2Cバス)、その後も上ること(コードする 特定のデバイス はI2Cバス---でも私はダイビングがあり私の下のモジュールの取扱い癖なかったです。これらの間に長時間を取得しまっhack-ishコードです。

私の目標である8ビットマイコンで以下のように思わかることができるハードウェアです。を行った場合はトップダウンな場所だとは思いませんでした構造を構築またはテスト/デバッグ.

された図面が全体図とも特定のレベル/ドライバーがなんなのかどのように構成していく体系的で、見逃さないための信号を通り2-3層です。

この理由度CS?私はアムネスティ-インターナショ:P

役に立ちましたか?

解決

あなたは正しい軌道に乗っているように聞こえます。後日、システムの部分を再設計またはリファクタリングすることを妨げる計画の量がない場合があります。次のヒントを試してみてください。

  • 論理関数によって分離されたモジュールのコードを保持します。
  • コードを複製しないでください。代わりに、共有機能のための再利用可能な方法を設計します。
  • 特別なケースのハックを追加する誘惑を避けるようにしてください。最終的にこれは維持できなくなります。代わりに、小さなセクションをできるだけ早く調整してリファクタリングします。最後に大規模な再設計を実行しようとするのはより困難です。
  • 実際の実装に到達したときに時間を浪費しているかもしれないので、最初からシステムを過剰に設計しようとしないでください。
  • より低いレベルを可能な限りシンプルに保ち、より高度な機能を上に構築します。
  • 特に複雑な条件付きステートメントを追加した後、機能を文書化し、いくつかのユニットテストを書きます。
  • 可能な限りスタックの上にエラーをキャッチしてみてください。たとえば、入力検証を実行し、返品値をチェックします。これにより、デバッグが簡単になります。

他のヒント

マルチ層コードで作業するとき、APIがあなたが望むことを正確に行わせない場合、より低い層に飛び込むのは魅力的です。これは、Mulitple層を同時に書くときに特に困難です。

ここにいくつかの提案があります:

  • あなたが取り組んでいるティア以外のすべてのティアは、まるでそれらが密封されているかのように扱います。別の会社、開発者などによって作成された。現在の層の問題を解決するために別の層を変更する衝動に抵抗します。
  • あなたが取り組んでいるものに「兄弟ティア」を作成します。これは抽象的な意味で説明するのは難しいですが、下層がビジネスレイヤーであり、より高い層がUIであるとすると、別のアプリケーション用の別のUIレイヤーを作成します。現在、同じAPIの2人の消費者がいることで、各レイヤーに何があるべきかを指摘するのに役立ちます。
  • ティアで作業する順序を交互にしてみてください。たとえば、一部のアプリでは、最初にUIを設計する方が便利だと思います。次に、ビジネスレイヤー/データベースに進んで、そのUIが設計どおりに機能するようにします。また、データモデルを統計してUIまで作業する方が理にかなっています。しかし、ポイントは、これら2つのシナリオでAPIの「考える」ことです。また、両方の角度からマルチ層コードを調べると、役立ちます。
  • 経験数。過度に結合したコードの間違いを犯すことが、それを避けることを本当に学ぶ唯一の方法であることがあります。アプリが完璧であることを計画する代わりに、それが不完全であることを計画してください。つまり、最初に迅速な開発/テスト/リファクタリングサイクルをセットアップすることを意味します。そうすれば、あなたがそれらを作るまで見かけない間違いに迅速に適応できるようにします。これは、「スローアウェイプロトタイピング」が役立つ領域でもあります。シンプルなラフドラフトを作成し、そこから学び、捨ててください。捨てる部分は重要です。たとえ驚くべきことであっても、別のものをゼロから構築し始めてください。プロトタイプから学んだことに基づいて、あなたはそれをより良くします(そして私の満足度、より組織化されています)。

それは本当にあなたの学位よりも経験の問題です。ハードウェアの制御方法についてまだ学んでいる場合は、もちろんコードが変更されます。私はそれを苦しめません。ただし、実際に行っていることはプロトタイピングであるため、動作したらコードをリファクタリングする準備ができている必要があります。冗長性を削除し、データと機能を区画化し、インターフェイスを整理して理にかなっています。

私の経験では、デバイスドライバーコードには、トップダウンとボトムアップのデザイン/実装が必要なことです。ユーザーが何をしたいのかを知っており、それらのインターフェイスを書くことができ、低レベルのドライバーが何をする必要があるかを知っていて、それを書くことができます。真ん中でうまく会わない場合は、モジュールのレイアウトを再考してください。

改善のために、より多くの経験を持つ人々がデザインとコードをレビューするようにしてください。エゴをそのままにして、問題を引き受けてください。また、オブジェクト指向の分析とデザインに関する本を読むこともできます(以前はPeter Coadの本が好きでした。誰が今書いているのかわかりません)。良いものは、明確な役割と責任を持つオブジェクトに問題を分割する方法の例を示します。

もう1つの作品は、ドライバーのプロトタイピングを完了し、ハードウェアを制御する方法を知っていれば、詳細な要件があることを確認することです。あなたが書いている間に要件を発見することほどコードをひねるものはありません。また、コードを書く前に、UMLを学習し、図でデザインすることもできます。これは誰にとってもうまくいきません。また、OODを使用するためにオブジェクト指向のコンストラクトをサポートする言語でコーディングする必要はないことに注意してください。

あなたの問題が適切な抽象化を構築する方法である場合、これは事実のようです、私はあなたが学ぶためにできる最も重要なことは(デザインコードのレビュー/読み取り/読み取りコードを求める以外に)ことだと思います コードの作成を開始する前に頑張ります.

通常、自分が何を望んでいるのか、それがどのように行われるべきかについての大まかなアイデアから始めてから、コードを書き続けることが起こります。後で、あなたは物事を考えていなかったことを発見し、コードを書くのに時間を費やしたので、今ではいくつかの大きな穴がありますが、パッチが困難であるため、時間の無駄なコードまたはハッキーなコードにつながります。

変更を簡単に処理できるデザインを作成する方法について頑張ってください。たとえば、レイヤー間を移動する必要があるデータをカプセル化するため、後で重要なパラメーターを逃したことを発見した場合、どこでもコードを変更することなく構造に簡単に追加できます。

あなたが最も重要な詳細を考慮し、あなたが言うことができることを確信するまで、何度か「あなたの頭の中でデザインを実行する」ようにしてください(これは、あなたが常に見逃したり、要件が変わるので、これは最も重要な部分です)何かを逃した場合、モジュールを比較的簡単に調整できます。

uml デザインについて考える方法を構築するのに役立ちます。確かに万能薬ではありませんが、ソフトウェア設計を作成する際に考慮すべきさまざまな基準を示しています。

それは古典的なチェスの先生のアドバイスに少し似ています:」あなたの手に座ってください" :-)

ドライバは与える層です。

運転者が複数の"授業":

  • 入力のみ
  • 出力のみ
  • ってO.

彼らはすべて標準化したインターフェース、例えば:

GetKnobLevel()
GetNextKeyboardButton

または、別のアプローチをしてい

syscall(DRIVERNUMBER, command)

をパラメータの結果に指定登録する

シンプルで使用できます。より複雑な変形がい円形のキューとハードウェアの通信コードとソフトウェアの通信コードの代わりに登録する

ここでは、メンタルモデルを使用してい:

---
Application
---
OS
---
Driver communicators
---
drivers
---
hardware

が緊密に定義され、分散界面の各層間の思いを想像し、ケーキ層厚着霜層間...).OSに存在していないかもしれないだろう。

場合はマイコン対応ソフトウェア及びハードウェア障害のx86CPU、できる利用者を特定するドライバーからのドライバは、コミュニケー

これはカブトムシやクワガタ"overengineery"ソリューションする事をお召し上がりいただけます。しかし、状況が複雑化が著しいう厳しい工学によってゆったり。

の場合はコミュニケーション層を使用できるグローバル変数の各通信チャンネル"は、アクセスで厳格なファッション、機能へのアクセスします。

一般的に使いたい紙デザインも、探鉱作業をもとに、リデザインの前までをコードするには、次のようにしますフローチャートやバス-遷移図もこちらです。

このアプローチかに好きに私の組み込みシステムの仕事とうまく動作しています。

しておりますのでこの問題はスペースなどにより従来のコンピュータ科学のカリキュラム.いかに寛容で、Webまたは現代のシステムです。

私の意見では、アーキテクテッドコードの最も重要な側面は 低いカップリング状態からの副作用の分離.

また - コードはクラフトです。最初から完璧な解決策を作ることができるとは思わないでください。あなたが新しいことを学ぶとき、あなたのコードを変更する準備をしてください。実際、あなたが受け入れることを確認してください それを自分で変えます あなたの仕事の一部として。

あまりにもグリブではなく、からの引用 神話上の人間 頭に浮かぶ:「捨てる計画。とにかくあなたはそうするだろう。」

その結果は「それを機能させる。それを正しくする。速くする」。

これにより、私はいくつかのデザインを前払いすることを支持しているが、それによって麻痺していないと思う。初めて完璧である必要はありません。リファクタリングを計画します。うまくいけば、あなたは本当に多くのコードを捨てているのではなく、より楽しい方法で物事を再配置するような方法で物事を書いたでしょう。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top