数年前、私はリリースされたばかりの Samsung BADA SDK と関連資料を閲覧していましたが、言語とプラットフォームのさまざまな基本的な側面を明確にしようとする「チュートリアル」と「ガイドライン」の量に驚きました。 C++ 言語レベルでの明らかなエラー (つまり、 http://mobileawards.ir/LinkClick.aspx?fileticket=zf9YxiDILVg=& tabid =937 の 8 ページと 9 ページを参照してください- プレゼンテーションは Samsung によって公開されており、コード例はオリジナルです。 SDK内のどこかで似ています)。しかし、それは比較的新しいものだったので、彼らはそれを片付けるだけだと思っていました.
最近、「タイプミス」または「誤って間違ったコード例」として却下できないものの1つについて私に何かを言いました:
virtual result Osp::Base::Collection::IList::Add ( const Object & obj ) [pure virtual]
パラメータ:
[in] obj 追加するオブジェクト
備考:
このメソッドは浅いコピーを実行します。ポインタだけを追加します。要素そのものではありません。
…………
_virtual Object* Osp::Base::Collection::IList::GetAt( int index ) [純粋仮想]
私にとって、「クラシック C++」の観点からは、これは明らかなエラーです。それは多くのレベルで非常に間違っています:
リストに格納される参照によって一般的なものを受け入れます。備考には、コピーではなく、参照ではなく、ポインタによって格納されるという注意があります。ポインターの代わりに by-ref を使用すると、おそらく実装者はいくつかのキャスト/*/& を強制的に実行することになりますが、それは比較的小さな問題です
受け入れられる参照はconstです。アイテム アクセサー GetAt() は、実際には非 const オブジェクトを返します。したがって、コレクションはすべてを自動的に非構築化します..
Add() スタックベースまたは一時オブジェクトをリストに追加しないように指示するさまざまなガイドラインに、多くの警告があります。
new
..によって割り当てられたヒープベースのオブジェクトのみを Add() するように明示的に指示します。GetAt は、実際には参照ではなく非 constポインターを返します! おそらく、魔法の値をエラーとして返すことができるようにするためです (BADA には例外処理がありません..)。リスト処理に関するいくつかのさまざまなチュートリアルを見て、これらすべての * と & が散在し、最も驚くべき場所に配置されていることを確認します。
MyObj* x = new MyObj(); list.Add(*x); // the '*' is at least mighly misleading..
これは後で、ポインターを使用せずにサムスンのバダ開発のような驚くべき質問につながります。これは、貧しい人が本当に混乱していたことを示しています..しかし、私は脱線し始めます..
上記は、コア インターフェイスの 1 つのフラグメントであり、後でさまざまなコア コレクションによって実装および使用されます。実際、すべてのハッシュ/リスト/その他には、同様の規則があります。
私にとっては、Java や C# などのトレーニングを受け、C++ 言語についてほとんど知らない人によって設計されたように見えます。const は常に乱用されており、参照も乱用されています。また、これには理由がありません*)
ここで私の判断は間違っていますか?これらのインターフェイスがそのように設計されている理由を合理的な説明を知っていますか?正確には、次の説明を探します:
- 実際には意味も保存もされていないのに、なぜ彼らは「const」を使用するのですか?
- 彼らは使用されていない発言で言っているのに、なぜ参照を使用するのですか?
(*) まあ、「参照を NULL にすることはできない」という都市伝説を除きます。これは、「Add」が null ポインターを受け入れることができないことを示している可能性があります。Add(*ptr)
要素を追加するには逆参照する必要があるため、それは非常識な考えです.
編集/質問の根拠:
マイクの即座の適切なコメントの後、私は「暴言」を可能な限り削除しようとしました。それでも、エラーについて不平を言うように聞こえずにエラーを提示するのは困難です。私は悪い開発者ではありません。暴言を吐く本当の理由はありません。私の質問は修辞的なものではありません。この設計の理由を本当に知りたいです。「この開発者が悪かったから」という単純な理由は受け付けません。これは可能性が高く、私はそれを考えましたが、私は全知ではなく、まあ、それはまったく証明できないので、そのような推論を拒否します. 気になるので理由を知りたいので質問します。経験豊富なバダ開発者が現れて、それについて説明している記事を教えてくれることを願っています。シンビアン。迅速な対応は期待していません。このような情報を提供できる人はおそらく地球上にあまりいないので、この質問は答えられずに長引くと思います. しかし、これはこの問題を修辞的なものにするわけではなく、私の見解では、それを問題のないものにするわけではありません。もちろん、誰もが異なる見方をすることができます。その場合は閉鎖となります。このような情報を提供できる人はおそらく地球上にあまりいないので、この質問は答えられずに長引くと思います. しかし、これはこの問題を修辞的なものにするわけではなく、私の見解では、それを問題のないものにするわけではありません。もちろん、誰もが異なる見方をすることができます。その場合は閉鎖となります。このような情報を提供できる人はおそらく地球上にあまりいないので、この質問は答えられずに長引くと思います. しかし、これはこの問題を修辞的なものにするわけではなく、私の見解では、それを問題のないものにするわけではありません。もちろん、誰もが異なる見方をすることができます。その場合は閉鎖となります。