なぜ動的言語にはクラスでプライベートメンバーを定義する機能がないのですか?この機能に関する実装上の懸念はありますか?この機能を動的言語に実装することは可能ですか?
4 に答える
この種のことに対する答えは無数にあります。「なぜ言語Xには機能Yがないのですか?」そして答えは、言語の作成/進化に関与した人々がそれをそこに置いていなかったからです。コンピュータの言語は似<insert anything here that has variations across members in the set>
ていますが、すべてが同じというわけではありません。(私たちのほとんどが感謝しています。;)
ああ、移動するターゲットの質問...
私はObjective-Cの専門家ではありませんが、「動的言語でのプライベートメンバー関数」をすばやくグーグルで検索すると、Objective-Cがクラスのプライベートメンバーをサポートしていることを示唆しているように思われるヒットが見つかりました。
これは動的言語に実装できます。実際、Smalltalkでは、すべてのメンバーは常にプライベートです。
これが一般的でない理由は、公的メンバーと私的メンバーの両方を持つことに意味がないためです。設計上、外部コードは他のクラスの内部にアクセスしないでください。これは、それを行わないことで達成できます。誤って行うことは簡単ではありません。
Pythonは、すべてを公開し、プログラマーが必要に応じてこれを実行できるようにすることでこれを解決します。これにより、最大限の柔軟性が生まれます。Smalltalkは、すべてをプライベートにし、他のコードからのアクセスが必要な場合はプログラマーにアクセサーを作成させることでこれを解決します。
実装の懸念に関しては、アクセスチェックは比較的高価です(少なくとも一部の属性アクセスでは、余分な操作があり、ルールが微妙であるほど、チェックは複雑になります)。したがって、すべてのプライベートモデルとすべてのパブリックモデルは非常に高価です。中程度のアクセスレベルの何よりも魅力的です。
Objective-Cでクラス展開を使用して、他のクラスに見えないものを作成できます。元。
//at the top of MyClass.m
@interface MyClass ()
@property (strong, nonatomic) id myPrivateProperty;
@end
それ以外は、質問が広すぎるので(まだ)言うことはあまりありません。
または、さらに@Mettableによる回答:
@interface MyObject : NSObject {
@private
id _myIvar;
id _myOtherIvar;
}
.
.
.
@end
Pythonについてはわかりませんが、このSOの回答が役立つと思います。