2011-07-05 3 views
8

私は物理学の分析コードを書いています。最初は自分のために使いました。私たちの誰もC + +の達人です。私は、分析要件に応じて容易に入れ替え可能な一連のツールによって作用されるオブジェクトに「物理現象」データを抽象化する小さなフレームワークをまとめました。友情は継承されない - 代替案は何ですか?

これは、イベントオブジェクトを操作し、ベース "ツール"の派生物を使用して結果を生成する "物理解析"コードの2つのコードを作成しました。入力ファイルを添付し、ジョブを並列実行に分割し、スクリプトをいくつかのスクリプトにしたがってチェーンにリンクする「構造的な」コード。

問題はこれです。他の人がコードを使用することが不可欠ですどのユーザーも、イベントデータを変更するたびに1つの手順を実行する必要があります。難しい構造コードの(多くの)余分な行は、物理的に明らかで明らかにそうでない限り、難しいかもしれません。悪いことに、それをあまりにも詳細に見ると人々にアイデアが与えられるかもしれません。そして、むしろ理にかなった理由で構造コードを編集したくないのです。そして最も重要なのは、物理学に影響するものを導入してはいけません。

私のことができるようにしたいと思います:

  • A) 構造のコードがどのような方法
  • Bに イベントデータを編集していないことは明らかな方法で証明)他のユーザーたらこれを強制 は、コードそのものを拡張し始める (私たちのどれもが 専門家ではない、と物理学は常に 最初に来る - 翻訳:ない がダウンボルトで固定何が厄介な ハックのための公正なゲームである)

私の理想的なシナリオでは、イベントデータはプライベートで、派生した物理ツールはツールの基本クラスからのアクセスを継承しています。もちろん、これは許されていません。これには理由があると聞いていますが、それは問題ではありません。

残念ながら、ベース(友人である)からgetters/settersを呼び出す方法は、解決するよりも多くの問題を引き起こします。コードはきれいで、従うのが簡単で、ツール自体を実装する際にできるだけ物理的なものを使用する必要があります(ユーザーは、ツールを作成するためにC++またはプログラムの内部動作のエキスパートである必要はありません)。

私は信頼できるベースクラスを持ち、どの派生物も厳重な調査の対象となりますが、他の迂回路はありますか?または、他のベースの派生品へのアクセスを拒否する方法はありますか?


私は理想的には上記の二つの理由(AとB)のためにのみ、これらのツールへのイベントの内容へのアクセスを制限するだろう

class Event 
{ 
    // The event data (particle collections etc) 
}; 

class Tool 
{ 
    public: 
     virtual bool apply(Event* ev) = 0; 
}; 

class ExampleTool : public Tool 
{ 
    public: 
     bool apply(Event* ev) 
     { 
      // do something like loop over the electron collection 
      // and throw away those will low energy 
     } 
}; 

のようなものを持っている状況を明確にします。

解決策がありがとうございました。私が思ったように、私が望んでいた完璧な解決策は不可能です。dribeasの解決策は他の設定では完璧ですが、apply()関数では、基本的にすべての日の書き込み/編集apply()関数を使用するため、コードをできるだけ明確かつ簡潔にする必要があります。他の人が書いたすべての行を理解する必要があります。読みやすさと労力の点ではそれほど能力ではありません。私は "役に立たない"からのプリプロセッサソリューションが好きです。それは本当に分離を強制するわけではありませんが、誰かがそれを壊すために真に悪意を持っている必要があります。図書館を提案してくれた人には、これは間違いなく最初のステップになると思いますが、2つの主な問題にはまだ取り組んでいません(とにかくソースを提供する必要があるため)。

+2

ソースで作業する必要がある人やソースを見る人がC++のエキスパートでない場合は、C++を使用しないでください。 C++は、専門家ではない人にとっては厄介な言葉であり、特にOO技術が多用されている場合は、専門家になることはまずありません。 – DarenW

+0

これはよく知られているように聞こえる...イベントデータの所有者または所有者これらのユーザーツールは、イベントデータを変更するか、それを使用して新しいイベントデータを生成することになっていますか? – juanchopanza

+0

@DarenW、私はOPがここに選択肢がないと強く疑う... – juanchopanza

答えて

2

C++には、3つのアクセス修飾子があります。publicprotected、およびprivateです。ツールの基本クラスからのアクセスを継承する派生物理学のツールを使用して文あなたがprotectedアクセスしたいことを示していると思われるが、privateある実際のデータがToolであるかどうかは明らかではない(したがってprotected足りる)、または現在privateです友人のクラスTool

最初のケースでは、単にデータprotected作る:第2のケースで

class Tool { 
protected: 
    type data; 
}; 

を、あなたはツールレベルでのアクセサを提供し、例えばのように、言語に厄介なトリックを再生しようとすることができます。

class Data { 
    type this_is_private; 
    friend class Tool; 
}; 
class Tool { 
protected: 
    static type& gain_acces_to_data(Data& d) { 
     return d.this_is_private; 
    } 
}; 
class OneTool : public Tool { 
public: 
    void foo(Data& d) { 
     operate_on(gain_access_to_data(d));  
    } 
}; 

しかし、私はそれを完全に避けるでしょう。アクセス指定子が意味をなさないことがあります。彼らは間違いを避けるためのツールであり、同僚に警戒するのではなく、そのデータにアクセスする必要があるコード(Tool)を書くことが望ましい限り、絶対的な保護を忘れるかもしれません:それはいけません。同様にただそうすることを新たに作成したバックドアを使用する可能性のあるデータへのアクセスを獲得したいと考えてい

ユーザー:

struct Evil : Tool { 
    static type& break_rule(Data & d) { 
     return gain_access_to_data(d); 
    } 
}; 

そして今は誰もが簡単にDataへの扉としてEvilを使用することができます。 C++の詳細を知りたければC++FAQ-liteを読むことをお勧めします。

+0

(+1)プログラムの問題を説明するには、コード例を使用して、明白な音でも;-) – umlcat

+0

提案をありがとう。 Evilの状況はうまくいくでしょう。私は、Toolの基本クラスに組み込まれたトラッキングとロギングを持っており、すべてのツールとその設定は、設定スクリプトとともにプログラム出力に保存されます。ログに記録されたツールがスクリプトと一致しない場合、明白な誰かが悪事になっている - スクリプトにマッチした場合、あなたがしたことを実行する。しかし、警告のおかげで。 – Anthony

0

アクセス権ではなく、可視性を制限するCスタイルのアプローチもあります。ツールの実装の詳細が構造コードに漏れてしまうのを防ぐために、ある種のインクルードガードを使用することはできますが、規約ではなく、(ある程度は)ビルドシステムによって強化されています。

-- ToolInterface.hpp -- 
class Event; // just forward declare it 

class ToolStructuralInterface 
{ 
    // only what the structural code needs to invoke tools 
    virtual void invoke(std::list<Event*> &) = 0; 
}; 

-- ToolImplementation.hpp -- 
class Event 
{ 
    // only the tool code sees this header 
}; 
// if you really want to prevent accidental inclusion in the structural code 
#define TOOL_PRIVATE_VISIBILITY 

-- StructuralImplementation.hpp -- 
... 
#ifdef TOOL_PRIVATE_VISIBILITY 
#error "someone leaked tool implementation details into the structural code" 
#endif 
... 

パーティショニングのこの種は、別々のライブラリにツールや構造のコードを置くことに自分自身を貸すことに注意してください - あなたも、ツールのコードに別々の構造のコードへのアクセスを制限することができるかもしれない、とだけ共有ヘッダとコンパイルされたライブラリ。

2

ツールを作成したい人が使用するヘッダーを含むライブラリとしてコードを提供します。これは、元のままにしたいものをうまくカプセル化します。誰もがソースにアクセスして何かを変更したいと思っているなら、ハッキングを防ぐのは不可能です。

関連する問題