タグ付けされた質問 「method-overloading」

10
関数のオーバーロードのためだけにC ++コンパイラを使用するのは悪い習慣ですか?
そのため、特定のプロセッサでCを使用したソフトウェア設計に取り組んでいます。ツールキットには、CおよびC ++をコンパイルする機能が含まれています。私がやっていることに関しては、この環境で利用可能な動的メモリ割り当てはなく、プログラムは全体的にかなり単純です。言うまでもなく、このデバイスにはプロセッサー能力やリソースがほとんどありません。C ++を使用する必要はまったくありません。 そうは言っても、関数のオーバーロードを行う場所はいくつかあります(C ++の機能)。いくつかの異なるタイプのデータを送信する必要がありますが、printf何らかの%s(またはなんらかの)引数でスタイルの書式設定を使用する気はありません。私はC ++コンパイラにアクセスできない人を何人か見ましたprintfが、私の場合はC ++サポートが利用可能です。 これで、なぜ関数をオーバーロードする必要があるのか​​という疑問を最初から得ることができると確信しています。だから私は今すぐそれに答えようとします。シリアルポートからさまざまな種類のデータを送信する必要があるため、次のデータ型を送信するオーバーロードがいくつかあります。 unsigned char* const char* unsigned char const char 私は、これらすべてを処理する1つのメソッドを持たないことを好みます。私はちょうどそれがシリアルポートを送信する関数を呼び出すときに、私は多くの資源を持っていないので、私はかろうじて行うにはしたくない何でもいいけど、私の送信を。 他の人が私のプログラムを見て、「なぜCPPファイルを使用しているのですか?」だから、それが私の唯一の理由です。それは悪い習慣ですか? 更新 私は尋ねられたいくつかの質問に対処したいと思います: あなたのジレンマに対する客観的な答えは以下に依存します: C ++を使用する場合、実行可能ファイルのサイズが大幅に増加するかどうか。 現在、実行可能ファイルのサイズは、プログラムメモリの4.0%(5248バイトのうち)とデータメモリの8.3%(342バイトのうち)を消費しています。つまり、C ++用にコンパイルしています... Cコンパイラを使用していないため、Cでどのように見えるかわかりません。私はこのプログラムがこれ以上成長しないことを知っているので、リソースがどれだけ限られているかについては、私はそこで大丈夫だと言います... C ++を使用している場合、パフォーマンスに顕著な悪影響があるかどうか。 ある場合、私は何にも気づいていません...しかし、それでも私は完全に理解していないので、私はこの質問をしている理由かもしれません。 Cコンパイラーのみが使用可能な別のプラットフォームでコードを再利用できるかどうか。 私はこれに対する答えが間違いなくノーであることを知っています。別のプロセッサへの移行を実際に検討していますが、より強力なARMベースのプロセッサのみです(事実、C ++コンパイラツールチェーンを持っていることは事実です)。

2
PHPが関数のオーバーロードをサポートしないのはなぜですか?
プログラミング言語の重要な機能の1つは、引数を介して関数をオーバーロードする機能を持つことだろうかと思います。これはオブジェクト指向プログラミングの文脈において不可欠だと思います。 意図的に取り残されて許可されていませんか?または、オーバーロードは良い習慣ではありませんか?

5
メソッドを引数名(型ではなく)で区別するだけで十分ですか?
メソッドを引数名(型ではなく)で区別するだけで十分ですか、それとも明示的に名前を付ける方がよいでしょうか? たとえば、T Find<T>(int id)VS T FindById<T>(int id)。 ById引数名だけを保持するのではなく、より明示的に名前を付ける(つまり、追加する)正当な理由はありますか? 私が考えることができる理由の1つは、メソッドのシグネチャが同じであるが、意味が異なる場合です。 FindByFirstName(string name) そして FindByLastName(string name)

2
無制限の量のパラメーターを取るメソッドが、より少ないパラメーターでオーバーロードを定義することが多いのはなぜですか?
たとえばSystem.IO.Path.Combine、.NET のメソッドには次のオーバーロードがあります。 Combine(params String[]) Combine(String, String) Combine(String, String, String) Combine(String, String, String, String) 最後の3つのポイントは何ですか? 最初のものはそれらをすべてカバーしますが、よく見るとparamsキーワードを使用しています。Combine(String, String).NET 4までの唯一のバージョンであったため、下位互換性の議論はバリアントのみを対象としています。

12
メソッドは構文糖衣以上のものをオーバーロードしていますか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 5年前に閉鎖されました。 メソッドは多型の型をオーバーロードしていますか?私には、同じ名前と異なるパラメーターを持つメソッドを単に区別しているように思えます。だから、stuff(Thing t)およびstuff(Thing t, int n)これまでのコンパイラとランタイムが懸念している限り全く異なる方法です。 呼び出し側では、異なる種類のオブジェクトで異なる動作をする同じメソッドであるという幻想を作成します-多態性。しかし、それは幻想に過ぎません。実際stuff(Thing t)とstuff(Thing t, int n)まったく異なる方法だからです。 メソッドは構文糖衣以上のものをオーバーロードしていますか?何か不足していますか? 構文糖の一般的な定義は、純粋にローカルであるということです。コードの一部をその「甘くされた」同等物に変更する、またはその逆の意味は、プログラムの全体的な構造に影響を与えないローカルな変更を伴います。そして、メソッドのオーバーロードはこの基準に正確に適合すると思います。例を見てみましょう: クラスを考えてみましょう: class Reader { public String read(Book b){ // .. translate the book to text } public String read(File b){ // .. translate the file to text } } 次に、このクラスを使用する別のクラスを考えます。 /* might not be the …

4
オーバーロードされたメソッドの名前を変更する必要がありますか?
これらのメソッドを含むインターフェースを想定します: Car find(long id); List<Car> find(String model); このように名前を変更する方が良いですか? Car findById(long id); List findByModel(String model); 実際、このAPIを使用する開発者は、初期find()メソッドの可能な引数を知るためにインターフェイスを調べる必要はありません。 だから私の質問はより一般的です:コードでオーバーロードされたメソッドを使用することの利点は何ですか?

3
1つのメソッドが他のメソッドをオーバーロードするか、両方のメソッドが「オーバーロードされる」か
このメソッドを作成する場合 public void foo() そして、私はこのようなオーバーロードされたバージョンを作成します public void foo( string bar ) 2番目の関数が最初の関数をオーバーロードすると言いますか、それとも両方のメソッドが等しく「オーバーロード」されるのでしょうか? これは、別の関数によってオーバーロードされている基本型関数があることを意味します(継承に似ていますが、実際にはそうではありません)。 あるメソッドが「別のメソッドをオーバーロードする」ことができると仮定すると、「オーバーローダー」や「オーバーロード」などの用語が含まれている場合、それがまったく単語である場合も意味します。しかし、特にいくつかのオーバーロードが発生する可能性があるため、それはまったく正しくありません。 オーバーロードされたメソッドを作成するプロセスを書き留めたいと思ったときに、この質問に答えました。 例: 私は過負荷です foo 私はオーバーロードをしていfooてfoo( string bar ) オーバーロードされたメソッドを作成しています fooをオーバーロードしています ええ、この種のことで考えさせられました。どうしたらいいのかわかりません。オンラインでの関数のオーバーロードの説明は数千ではないにしても数百ありますが、一見するとこれに対処するものが見つかりませんでした。

1
PHPに静的プロパティをオーバーロードする機能がないのはなぜですか?
イントロ PHPでは、クラスでマジックメソッドを宣言することにより、メソッド呼び出しとプロパティアクセスをオーバーロードできます。これにより、次のようなコードが有効になります。 class Foo { public function __get($name) { return 42; } } $foo = new Foo; echo $foo->missingProperty; // prints "42" インスタンスのプロパティとメソッドのオーバーロードとは別に、PHP 5.3.0以降でstaticは、マジックメソッドをオーバーライドすることでメソッド呼び出しをオーバーロードすることもできます__callStatic。 何かが足りない 利用可能な機能から目立って欠けているのは、静的プロパティをオーバーロードする機能です。たとえば: echo Foo::$missingProperty; // fatal error: access to undeclared static property この制限は明確に文書化されています。 プロパティのオーバーロードは、オブジェクトコンテキストでのみ機能します。これらのマジックメソッドは、静的コンテキストではトリガーされません。したがって、これらのメソッドは宣言しないでくださいstatic。PHP 5.3.0以降、マジックオーバーロードメソッドの1つが宣言されている場合、警告が発行されstaticます。 しかし、なぜ? 私の質問は: この機能が現在サポートされていないという技術的な理由はありますか?それとも、(震え)政治的な理由ですか? 過去にこの機能を追加する試みが中止されたことはありますか? 最も重要なことは、質問は「ユーザーランドPHPで動的な静的プロパティをどのように設定できますか?」ではありません。とはいえ__callStatic、共有したいことに基づいて特にかわいい実装を知っている場合は、ぜひ共有してください。


3
メソッドのオーバーロードはいつ適切ですか?
既存のかなり大きなシステムで作業しているとしましょう。myObjectクラスのオブジェクトがありますMyClass(例として、Javaで作業しているとします)。myObjectはCollection、たとえばa Listと、(私が思うに)無関係な他のオブジェクトを含むコンポジションです。これには、Listそれが構成されているメソッドを呼び出す役割を果たしているデリゲートメソッドが含まれていますList。 これListがaであるとしましょう。List<String>何らかの理由で、メインのアクセスメソッドはclassのマスクメソッドですSomeOtherClass。新しい値のペアをmyに挿入しListたい場合は、SomeOtherClass呼び出されたオブジェクトがありますsomeObject。私が呼び出すmyObject.insert(someObject)と、insertメソッド内にを取得してStringに入れる魔法がいくつかありますList<String>。 今、String値しか持っておらずSomeOtherClass、挿入するオブジェクトがないとします。insertこのシステムのすべてを破壊するため、メソッドを変更できないと仮定します。次に、insertメソッドをオーバーロードする必要がありますか?またはSomeOtherClass呼び出すたびに新しいオブジェクトを作成する必要がありますinsertか? オーバーロードするとこんな感じになりますね… public void insert(String s) { ... } public void insert(SomeOtherObject obj) { this.insert(obj.magicStringMethod()); } (この例は、昨日発生したオーバーロードに関する同様の(やや複雑な)状況に基づいた不自然なパズルです。不明な点がある場合は展開します) これはメソッドをオーバーロードするのに適切な場所でしょうか?そうでない場合、いつメソッドをオーバーロードする必要がありますか?

5
戻り値型のオーバーロードが許可されないのはなぜですか?(少なくとも通常使用される言語)
すべてのプログラミング言語について知っているわけではありませんが、通常、戻り値の型(引数の数と型が同じであると想定)を考慮してメソッドをオーバーロードする可能性がサポートされていないことは明らかです。 私はこのようなものを意味します: int method1 (int num) { } long method1 (int num) { } プログラミングにとって大きな問題ではありませんが、場合によっては歓迎することもありました。 明らかに、どのメソッドが呼び出されているかを区別する方法なしにそれらの言語がそれをサポートする方法はありませんが、その構文は[int] method1(num)または[long] method1(num)のような単純なものにすることができますこれにより、コンパイラーは、どちらが呼び出されるかを認識します。 コンパイラがどのように機能するかはわかりませんが、それほど難しくはないように思われるので、なぜそのようなものが通常は実装されないのでしょうか。 そのようなものがサポートされない理由はどれですか?

4
同様のデータを取得するデータアクセスメソッドの重複を防ぐ方法は?
私がチームで取り組んでいるほぼすべてのプロジェクトで、同じ問題が侵入しているようです。誰かがデータを必要とするUIコードを書き、データアクセスメソッドを書きます。 AssetDto GetAssetById(int assetId) 1週間後、他の誰かがアプリケーションの別の部分で作業してAssetDtoいて、「承認者」を含む必要がありますが、次のように書きます: AssetDto GetAssetWithApproversById(int assetId) 1か月後、誰かがアセットを必要としていますが、現在は「質問」(または「所有者」または「実行中のリクエスト」など)が含まれています。 AssetDto GetAssetWithQuestionsById(int assetId) AssetDto GetAssetWithOwnersById(int assetId) AssetDto GetAssetWithRunningRequestsById(int assetId) そして、そのようなメソッドGetAssetWithOwnerAndQuestionsByIdが出現し始めると、さらに悪化します。 現れるパターンが表示されます。オブジェクトは大きなオブジェクトグラフにアタッチされており、このグラフのさまざまな部分をさまざまな場所に配置する必要があります。 もちろん、ほとんど同じことをするメソッドがたくさんあるのを防ぎたいです。それは単にチームの規律の問題ですか、それともこれを防ぐために使用できるパターンがありますか?場合によっては、個別のメソッドを使用することが理にかなっている可能性があります。つまり、実行中のリクエストでアセットを取得するのはコストがかかるため、常にこれらを含めたくありません。そのような場合の対処方法は?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.