1

私はかなり長い間 C コードを書いてきましたが、Objective-C と OO プログラムの設計は初めてです。私は自分のプログラムとそのクラスを設計する方法に頭を悩ませています-すべてに不透明なポインターを渡すという私のスタンバイ手続き型プログラミングパラダイムは、静かな死を遂げることはありません。Objective-C の Xcode4 で簡単なプログラムを書いていますが、設計と規則についていくつか質問があります。「PacketCapture」と「IPGeo」の 2 つのクラスを設計しました。1 つ目は libpcap の軽いラッパーで、いくつかの解析ロジックが追加されており、2 つ目は MaxMind の GeoIP C API の軽いラッパーです。メイン モジュールでは、PacketCapture クラスをインスタンス化し、制御をパケット キャプチャ ループに渡します。

int main(int argc, const char *argv[])
{
    @autoreleasepool
    {
        PacketCapture *_PacketCapture = [[PacketCapture alloc] init:"en1" withFilter:""];
        if (_PacketCapture == nil)
        {
            NSLog(@"Can't instantiate PacketCapture class");
            return (-1);
        }
        IPGeo *_IPGeo = [[IPGeo alloc] init:"/usr/local/share/GeoIP/GeoIPCity.dat"];
        if (_IPGeo == nil)
        {
            NSLog(@"Can't instantiate IPGeo class");
            return (-1);
        }

        NSLog(@"entering packet loop...");
        [_PacketCapture packetCapture];
    }
    return (0);
}

メソッド内でpacketCapture、パケットを切り刻んで表示する解析関数が呼び出されます。解析コード内で GeoIP ロジックを使用して、geo データベースに対して IP アドレスを検索する必要があります。そこに私の問題と一般的な混乱があります。

私の質問:

  • GeoIP クラスはどこでインスタンス化する必要がありますか?

  • クラスのオブジェクト内に無限ループがあるのは悪い OO 設計ですか? ありそうな感じ。おそらく、この問題を再構築すれば、簡単に解決できますか?

助けてくれてありがとう。

4

3 に答える 3

0

GeoIPクラス」とはどういう意味IPGeoですか?インスタンス化する場所は、いくつかの要因によって異なります。IPGeoクラス内の1つの解析メソッド内でのみ必要な場合は、そこでインスタンス化します。オブジェクトの存続期間を通じて必要な場合は、IPGeo代わりに指定されたイニシャライザーでインスタンス化し、インスタンス変数に保持します。

無限ループは本質的に悪いことではありませんが、通常はより良いアプローチがあります。どのプラットフォーム用に開発していますか?

ちなみに、NSStringリテラルには次の@ような接頭辞が付いています@"foo"。プレーンなC文字列を使用しているため、を予期しているObjective-Cコードにそれらを渡すと、クラッシュが発生する可能性がありますNSString

于 2012-05-14T23:01:53.887 に答える
0

GeoIP クラスはどこでインスタンス化する必要がありますか?

オブジェクトが機能PacketCaptureする必要がある場合は、のメソッド内でインスタンス化することをお勧めします。オブジェクトを で使用する前に (たとえば、初期化時に別のパスを渡すことによって) オブジェクトを構成する必要があり、使用するパスが認識されるべきではない方法で決定される場合は、2 つの管理を担当するクラスを用意します (または、あなたの場合、プログラムのメインループ) インスタンスを作成し、それをクラスのカスタム初期化メソッドに引数として渡します。IPGeoPacketCapture-initIPGeoPacketCapturePacketCapturePacketCapture

少しつまらないことですが、あなたのイニシャライザはIPGeo、表現力豊かなメソッド名のObjective-Cの規則に従っていません。-initWithPathToDatabase:私の意見ではずっと良く見えるでしょう。

同様に、クラスに-initWithIPGeo:メソッドを追加できます。PacketCapture

クラスのオブジェクト内に無限ループがあるのは悪い OO 設計ですか?

これが iOS または Cocoa アプリケーションである場合は、間違いなく「はい」です。コマンド ライン ツールの場合は、そうかもしれません。さらに、その無限ループがメイン スレッドで実行されている場合、すべての UI 要素がブロックされ、プログラムが応答していないように見えます。

より良い代替手段は、Objective-C プログラムの定番であるプロトコル/デリゲート パターンを使用することです。次のような方法でプロトコルを作成します。

- (void)packetCapture:(PacketCapture *)packetCapture didReceiveDataFromIPAddress:(NSString *)ipAddress;

次に、このプロトコルを実装し、パケットの受信時にアクションを実行するデリゲート オブジェクトを作成します。コマンド ライン ツールを作成している場合は、そのデリゲートをインスタンス化し、メッセージの受信を待機できます。

于 2012-05-14T23:08:20.667 に答える