私はかなり長い間 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 設計ですか? ありそうな感じ。おそらく、この問題を再構築すれば、簡単に解決できますか?
助けてくれてありがとう。