0

私は、ファイルの多くの異なる構造を読み取ることができるはずのログファイルデコーダーを書いています。私の質問は、このデータをどのように表現するのが最善かということです。私はC#を使用していますが、OOPは初めてです。

例:ログファイルには、さまざまなセンサー値があります。1つのセンサー読み取り値はA、別のBと呼ぶことができます。明らかに、2つ以上のエントリタイプがあります。異なるログファイルに、ABABABABABまたはAAAAABBBBBとして保存できます。

私はこれをエントリのブロックとして説明することを考えていました。したがって、最初のケースでは、ブロックは5ブロックの「AB」になります。2番目のケースでは、最初のブロックは「A」であり、5回読み取られます。この後に「B」のブロックが続き、5回読み取ります。

これは非常に単純化されています(実際には40種類のログファイルがあり、それぞれが1つのブロックに最大40個のセンサー値を持っています)。300ブロックを超えるログはありません。

現時点では、これらすべてをデータテーブルに保存しています。エントリごとに、読み取る数のプロパティを持つ列があります。これが-1に設定されている場合、ブロック内の次の列に進みます。そうでない場合は、ブロックの終わりに到達したと見なされます。

これはすべてかなり不器用なようです。誰かがこれを行うためのより良い方法を提案できますか?

4

4 に答える 4

1

最初にここから始めて、次にここでオブジェクト指向プログラミングとは何かについて少し学ぶべきだと思います。OOPについて学習している間は、現在の問題について心配する必要はありません。

OOの概念について学習しているので、コードはデータではなく、データはコードではないことを理解し始める必要があります。OOPスタンスからデータをどのように表現するかは重要ではありません。OOコードを記述してデータを消費することも、手続きコードを記述してデータを消費することもできます。その部分はデータの形式とは無関係です。

では、質問に戻りましょう

私の質問は、このデータをどのように表現するのが最善かということです

それはあなたのニーズに依存します。ログファイルの書き込みとは何ですか?ライターとリーダーを制御できますか?もしそうなら、私が書く必要のあるコードの量を最小限に抑えるために、組み込みのシリアル化メソッドを構築することに依存するでしょう。ログファイルは本当に長くなりますか?もしそうなら、あなたが説明した「データテーブル」アプローチが通常より良いです。ログファイルのファイルサイズが大きくならない場合、XMLは非常に簡単に操作できます。

于 2011-07-20T14:33:11.700 に答える
0

OOPに関しては、 SOLIDを学びたいと思います。

テスト駆動開発を使用してこれを構築することをお勧めします。

ログデータの単純な断片から始めて、次のようなテストを記述します(経験を積んでこれを行い、状況に適用するためのより良い方法を見つけることができます)。

[Test]
public void ReadSequence_FiveA_ReturnsProperList()
{
  // Arrange
    string sequenceStub = "AAAAA";

    // Act
    MyFileDecoder decoder = new MyFileDecoder();
    List<string> results = decoder.ReadSequence(sequenceStub);

    // Assert
    Assert.AreEqual(5, results.Count);
    Assert.AreEqual("A", results[0]);
}

そのテストコードスニペットは単なる出発点であり、私はアサーションでかなり冗長にしようとしました。時間の経過とともに、より創造的な方法を考え出すことができます。ポイントは小さく始めることです。このテストに合格したら、「AB」をミックスする別のテストを追加し、これを適切に処理するようにデコーダーを変更します。最終的には、さまざまな形式を処理する一連のテストが作成されます。TDDを使用すると、SOLIDを適切に使用するための道を歩むことができます。テストできないものを見つけた場合は、ルールを確認して、それを単純化して依存関係を注入できないかどうかを確認する必要があります。

最終的には、あざけることになります。MyFileDecoderたとえば、ログファイルを読み取る依存関係を持つクラスの機能を注入したい場合があります。その場合、モックオブジェクトを作成してコンストラクターに渡しsequenceStub、メソッドが呼び出されたときにを返すようにモックを設定します。

于 2011-07-20T14:50:54.160 に答える
0

ボブが提供したものに加えて、C#プログラマー向けのOOの穏やかで堅牢な入門書として、Head FirstDesignPatternsを強くお勧めします。サンプルはJavaであり、C#に簡単に変換できます。

于 2011-07-20T14:51:36.500 に答える
0

非常に基本的でわかりやすい:

  1. IEnrty次のようなプロパティでのインターフェースを定義しますstring EntryBlock, int Count
  2. を表し、Entry実装するクラスを定義しますIEntry
  3. バイナリシリアル化を行うコードは、インターフェイスを認識している必要があります。たとえば、参照する必要があります。IEnumerable<IEntry>
  4. クラスEntryはオーバーライドToString()して[ABAB-2]のようなものを返す可能性があります。これがシリアル化中に役立つ場合は、確かに
  5. インターフェースが役立つ場合IEntryは、メソッドvoidを提供できます。自分で決めてくださいCreateFromRawString(string rawDataFromLog)

詳細情報が必要な場合は、シリアル化/逆シリアル化に使用しているコードを共有してください

于 2011-07-20T15:20:06.257 に答える