私たちは数十年に渡って開発された大きなCコードベースを持っています。コードの特徴の1つは、関数ポインタと擬似継承に大きく依存することです。イディオムは、(hereを論じたように)ようなので、以下:Cで継承:良い、悪い、またはその他?
typedef struct twod_ {
double x, y;
} twod;
typedef struct threed_ {
twod super;
double z;
} threed;
threed *point_3d;
twod *point_2d = (twod *)point3d;
た時点point_2d->x
とpoint_3d->x
は、メモリの同じブロックです。
私の質問は以下のとおりです。
- このイディオムは、現代の生産コードではまだ普及していますか? (推奨されるオープンソースの例)
- このコードでは、パフォーマンスの要件があります。このイディオムは速度やメモリの使用に役立ちますか?
- これは実装された方法(または長年のコードが膨らんでいるため)では、スパゲッティコードのように感じるようになりました。これは実装やイディオムの問題ですか?別の言い方をすると、理想的な世界では、このイディオムを持つ500k LOCはすばやく理解できますか?もちろん
、格言、「それは壊したaintの場合は、それを修正していない」心に留めておくのは良いものであろう。しかし、それは現時点で私たちを助けてくれるわけではないので、リファクタリングでもっと深く考えなければならないと思っています。
ありがとう!
"twod"変数を逆参照しようとすると、未定義の動作に終わってしまいますが、最後の行を 'twod * point_2d =&point3d.super; 'で置き換えると、水はうまくいきます。 –
イディオムに関係なく、500k LOCがすぐに理解できるとは思わない –
私はtwod * point_2d =(threed *)point3dだと思います。あなたは実際にtwod * point_2d =(twod *)point3dを意味しました。 – MetallicPriest