問題タブ [duck-typing]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - pygameでのMVCイベント処理のためのPythonダックタイピング
友人と私はpygameで遊んでいて、pygameを使用してゲームを構築するためのこのチュートリアルに出くわしました。ゲームをモデルビューコントローラーシステムに分割し、イベントを仲介する方法が本当に気に入りましたが、コードはイベントシステムのチェックを多用しています。isinstance
例:
これにより、非常に非Python的なコードが生成されます。これをどのように改善できるかについて誰かが何か提案がありますか?または、MVCを実装するための代替方法論ですか?
これは、@ Mark-Hildrethの回答に基づいて作成したコードです(ユーザーをリンクするにはどうすればよいですか?)他に良い提案はありますか?解決策を選ぶ前に、これをもう1日ほど開いたままにしておきます。
これは@Paulの例を使用した別のビルドです-非常にシンプルです!
actionscript - Actionscriptダックタイピング
サブクラスの保護された関数をオーバーライドしています。
AppleとFruitの2つのクラスがあるとしましょう。私はすべての変数を配置しています。これは単純化されたバージョンです。
例は簡単です。問題は、getRandom関数のタイプがそれ自体のタイプに依存することです。1つはリンゴを返し、もう1つは果物を返します。もちろん、オーバーライドと強制についてエラーが発生します。
Appleの代わりにFruitを返そうとしましたが、オブジェクトはAppleではないため、Apple固有のプロパティはありません。問題はダックタイピングにあります。変更できない3番目のクラスがあります。これは各オブジェクトでgetRandom()関数を実行し、Appleは少し異なるものである必要があります。
AppleのgetRandom関数をオーバーライドして、フルーツではなくアップルを返すようにするにはどうすればよいですか?
ruby - Ruby のオープンな動的クラス構造 (ダックタイピング) は安全ですか?
私は、長年の Java 経験を持つ新米の Ruby/Rails 開発者です。この「セキュリティ」の質問は、Rails ではなく Ruby に固有のものです。そのため、ほとんどの Rails のセキュリティに関する質問は Web に関するものであるため、答えを見つけるのが困難でした。
Java 開発者として、Effective Java を何度か読みました。その本の重要なポイントの 1 つは、クラス内のデータとメソッドを悪意のあるユーザーから保護することです。つまり、コードをできるだけ非公開にし、不変クラスを使用し、不変オブジェクトへの参照を返すときに防御コピーを使用します。final キーワードも使用できます。
しかし、Ruby ではすべてがオープンです。確かにメソッド/データを非公開にすることはできますが、Ruby API の消費者として、メソッドの独自のバージョンを作成し、単純に (実行時またはコードで動的に) クラスにアタッチすることを妨げるものはありますか? API? 効果的な Java で説明されているすべてのセキュリティは、Ruby にはまったく適用されないようです。これは Java からの単なる考え方の変化ですか? これは、Ruby や他の類似言語の「欠陥」ではありませんか?
c# - このように動的に動作させることはできますか?
私は患者クラスを持っています:
私もインターフェースを持っています:
このコンソールアプリケーションでは、Display_Personメソッドを機能させたいと思います。コンパイルされますが、PatientがIPersonを実装していないため、実行時エラーがスローされます。
PatientにIPersonインターフェイスを実装させずに、Display_Personメソッドを機能させるためにどのようなコード変更を行うことができますか?再利用可能なソリューションをお勧めします。
更新:インテリセンスを取得できるように、これを機能させたいと思います。この例のささいなことを過ぎて見てください。それは短く、私の問題を説明するところまでです。これが1003のローン申請である場合(印刷された場合は本のサイズです)、計算のために関連データをグループ化できるように、クラスに20以上のインターフェースを適用したくありません。また、これらすべてのプロパティを毎回入力する必要はありません。インテリセンスの欠如により、過去に動的言語を使用することから私を遠ざけました。(私は怠惰ではありません私は効率的です!)
algorithm - ネットワーク データ構造でメソッドを処理する Pythonic な方法
では、Pythonic とは何かについての別の質問です。この場合のアプリケーション ドメインは、ネットワーク アルゴリズム (ノード、エッジ、ダイクストラ、そのようなものなど) であり、以前は厳密に型指定された言語でコーディングしただけで、すべてが何であるかを非常に確信できるものです。
一方、Python では、クラスがNet
あります。このクラスの 1 つのインスタンスがネットワークを表します。Edge
ネットワーク内のエッジごとにインスタンス化されるクラスがあります。各Edge
インスタンスには、とりわけ固有の がありid
ます。
Edge
関連するインスタンスを参照してエッジを削除したい場合があります。を使用して Edge を削除したい場合もありid
ます。正直なところ、どの変数がEdges
で、どれが であるかを見失い始めていますids
。この仕事にはC++を好んだと思います:-P
そこで、2 つの解決策を提案します。
システムのハンガリー語表記の使用を開始します。変数に適切な名前を付けて、それらが実際の Edge オブジェクトなのか、必要な Edge の ID なのかがわかるようにします。強力な型付けを実装する - make
remove_edge
(これは on のメソッドですNet
) ではないものを明示的に拒否しEdge
ます。remove_edge_id
関連するものを検索してEdge
からid
呼び出すラッパー関数を作成しますremove_edge
。同様に、この関数は ではないものをすべて拒否しid
ます。ダックタイピングを使用します。
remove_edge
引数が anid
または anであるかどうかを確認Edge
し、正しいことを行うだけです。
一体いつ計算するの?
python - アヒルの種類を文書化する方法は?
複雑なダックタイプに遭遇するたびに、「このダックタイプ」と言う方法が必要ですが、代わりに「あなたの関数はこの入力のこれを必要としますが、 「それを文書化しないでください」、そしてそれを文書化します。これにより、次のような肥大化した反復的なドキュメントが作成されます。
、Baz
、Qux
およびその他の関数についても同様です。arg
「 (オブジェクトのタイプ)である」という短い書き方が必要です。
一部のアヒル型では、「辞書のようなオブジェクト」と同じくらい簡単です。辞書に何を期待するかを知っているので、何を渡すかを知っています。、dict
またはそれを模倣できるもの。
テンプレート化された型に関して、C++ にも同じ問題があると思います。Haskell にはそれがありますが、型クラスの定義を使用して文書化できます。(注: Haskell クラス != Java/C++/Python などのクラス) (注: 私は実際には Haskell でプログラミングを行っていないので、下手な例である場合はご容赦ください。)
従来の OO ルートを使用して、基本クラスを作成し、ドキュメントで「この基本クラスのようなもの」と言う必要がありますか? コードは基本クラスからの派生を強制せず (オブジェクトを派生させる必要がないため)、基本クラスはインターフェイスのプロパティを文書化する以外に値を追加しません。
一方、私は Python をプログラミングしており、言語のイディオム内でプログラミングしようとしています。基本クラスは機能を継承するのに適していますが、基本クラスが完全に抽象的である場合、ダックタイプの言語で価値を追加するようには見えません。
編集:答えに:私はアヒルのタイピングが何であるかを知っています(それは投稿から明らかなはずです)。それはどこに文書化すればよいですか、特に質問です。ドキュメントを添付するクラスが存在しない場合。
c# - オブジェクトの既存のインスタンスに対するダックタイピング / 動的プロキシ
ライブラリに渡され、さまざまなプロセスを経たオブジェクトがあります。これらのオブジェクトがさまざまな段階を通過して反対側に出るときに、これらのオブジェクトにいくつかの追加情報を添付する必要があります。既存の動作を変更するのではなく、追加のプロパティを追加することを除いて、一種の動的デコレータ パターンだと思います。
LinFu または Castle を使用して動的プロキシを作成し、オブジェクトに追加のインターフェイスを実装してこれを保存することを望んでいました。拡張インターフェイスを認識しているコンポーネントは、それをキャストしてアクセスできますが、そうでないコンポーネントは、基になる型が変更されていないため、認識されていません。
しかし、これらすべてのメカニズムが、型が最初に作成される時点を制御できると想定していることを認識していませんでした。
これにもっとうまくアプローチする方法について誰か提案がありますか?
どうもありがとう
xslt - XSD を使用した XSLT の要素のダックタイピング
XML 要素をパラメーターとして受け入れる関数を XSL で作成しています。この XML 要素には一定の期待があります。たとえば、<name>
サブ要素とサブ要素が必要<id>
です。したがって、次の 2 つの要素のいずれかが許容されます。
<name>
要素名、と<id>
が表示される順序、および要素が持つその他のサブ要素 (または属性) は気にしないことに注意してください。
この要件を XSD で表現して、 のas
属性に使用でき<xsl:param>
ますか?
python - Python ドキュメント: 何度も反復可能?
Python 関数を文書化する際に、次のように言う方がより Pythonic だと思います。
…ではなく…</p>
i
本当に である必要がない場合list
。( 、などで問題Foo
なく動作します。) 問題はジェネレータです。ジェネレーターは通常、1 回の反復のみを許可します。ほとんどの関数は、単一パスのみを許可するジェネレーターまたはイテラブルで問題ありませんが、そうでないものもあります。set
tuple
ジェネレーター/一度しか反復できないものを受け入れることができない関数について、「複数回しか反復できないもの」と言う明確で一貫した Python 用語はありますか?
Python のiterableとiteratorの用語集には、「1 回だけですが、運が良ければもっと多く」という定義があるようです。
pattern-matching - 非同期メソッドでの「反復」
非同期CTPに関するいくつかの関連する質問:
と列挙子メソッドを使用して、イテレータブロック(
IEnumerable<T>
yield-returningT
)を反復処理できます。メソッドのアナログは何ですか?非呼び出しメソッドでedアイテムを受信して処理するにはどうすればよいですか?簡単な例を教えてください。私はそれを見ていません。GetEnumerator()
MoveNext()
Current()
async
async
await
ContinueWith()
また、この次の例の
/li>async
メソッドでMyAwaitable
は、GetAwaiter()
メソッドがあります。GetAwaiter()
を返すstring
がTHuh
そうでない場合string
、コンパイラは文句を言いません。THuh
との間にどのようなタイプの制約/期待が存在しGetAwaiter()
ますか?C#仕様ドラフトの次の行を説明してください。決して使用されない
async Task<T>
メソッドが想定されreturn
ていますか?default(T)
このルールに従わないように見えるサンプルがいくつかあります。戻り値は到達可能であり、値はデフォルトではありません。この値にアクセスできませんか?もしそうなら、なぜ厄介なアクセスできないreturnステートメントですか?
Task<T>
一部のreturn型の非同期関数ではT
、returnステートメントに暗黙的にに変換可能な式がT
必要であり、本体のエンドポイントに到達できない必要があります。
- 仕様には、「GetAwaiter、IsCompleted、OnCompleted、およびGetResultのすべてが「非ブロッキング」であることが意図されている」と記載されています。したがって、(潜在的に)長時間実行される操作をどのメソッドで定義する必要がありますか?
ありがとう!