2011-12-31 5 views
2

言語で多くの異なるデータ型を使用する利点は何ですか?私は最近のPyQtとpyqwtで働いていると私はこのような行を入力して自分自身を見つける保つ:多くの異なるデータ型を持つ利点は何ですか?

grid.setPen(Qt.QPen(Qt.Qt.gray, 0, Qt.Qt.DotLine)) 
curve.setSymbol(Qwt.QwtSymbol(Qwt.QwtSymbol.Ellipse, 
           Qt.QBrush(), 
           Qt.QPen(Qt.Qt.black), 
           Qt.QSize(5, 5))) 

上記の行ではなく、以下であれば失われてしまう何?:

grid.setPen('gray', 0 ,'dotted') 
curve.setSymbol('ellipse', 'k', (5,5)) 

場合でも、いくつかの技術的な理由で特定の型が必要な場合、それらを必要とするメソッドの中で文字列を型に変換できないのでしょうか?

pyqtとpyqwtはC++ライブラリの単純なバインディングなので、これはありますか?もしそうなら、彼らはC++でなぜ必要なのでしょうか?

+0

これは単なる不可能なことであり、あなたが物事を考えなかったことを示しています。あなたがそれを提案したやり方では、すべての機能はすべてを知る必要があります。あなたの質問を再考してください。これは陽気です。 –

+0

私はこの質問が面白いようになるならば、私は謝罪します。私はプログラミングで教えられ、多くの理論を知らない。なぜそんなにばかなことを説明できますか?私が学んだ最初のプログラミング言語はMatlabでした。これはあなたが私が言ったことを正確に行うことを可能にします:plot(x、 'r-') – jminardi

+0

http://en.wikipedia.org/wiki/Data_typeはすでにいくつかの答えを含んでいました。正式なコンピュータサイエンス教育がなくても簡単に見つけました。私の返事も見てください。 –

答えて

4

そこにはいくつかの利点は次のとおりです(C++のような)

  1. タイプの安全な言語は(実行時ではなく)多くのエラーがコンパイル時に発見されたという利点があります。これは、型が定義されていないため、Qt.grey(eを書き留めてください)をコンパイルできないことを意味します。

  2. パフォーマンスが向上し、メモリが少なくなりました。背後では、Qt.grayは数値であり、数値演算は文字列よりもはるかに高速です。

ライブラリがC++ライブラリをラップするので、pyqtの場合、Pythonコードと同様にC++に似ています。

+0

Pythonはコンパイルされた言語ではないので、 – jminardi

+0

技術的にも、Pythonの多くの文字列は、その背後にある数字です(http://en.wikipedia.org/wiki/String_interning)。 – Amber

+1

Pythonインタプリタはスクリプトを解析していて、ファイルとは異なるもの(通常は何らかの抽象構文ツリー...)を解釈しているため、スクリプトの解析中にエラーが発生することがあります。 –

3

異なるタイプのあなたは、物事の右の種類を渡している(少なくとも、C++で)時間をコンパイルでチェックしてみましょう - すべては、文字列を取った場合、たとえば、偶然'gray'をタイプミスすることは非常に簡単になるだろう例えば'grey'のように、ライブラリを混乱させる可能性があります。

greypen = Qt.QPen(Qt.Qt.gray, 0, Qt.Qt.DotLine) 
blackpen = Qt.QPen(Qt.Qt.black, 0, Qt.Qt.DotLine) 
# ... 
grid.setPen(greypen) 
# ... 
grid.setPen(blackpen) 

あなたは属性の同じ種類を複数回使用している場合は、自分自身を繰り返す羽目になるませんその方法:

通常のパターンは、このようなより多くの何かをすることです。

+0

Qt.Qt.grey-> Qt.Qt.grayよりも「グレー」→「グレー」のタイプミスが悪いのはなぜですか?どちらも簡単に作ることができます。 Pythonは解釈されるので、これらのエラーは同時に検出されますか? – jminardi

+1

いいえ、解釈すると、スクリプトファイルをロードする直前にスクリプトファイルを内部表現に変更しています。その変更中(解析することもできます)にエラー検出が行われます。 –

+0

@jminardiいいえ、誰かがメソッド呼び出しの中で捕まえられるでしょう。手前で捕捉されるでしょう。また、すべての変換を行うためにメソッド呼び出し自体に依存しています。*すべての*メソッド呼び出しは同じ変換を実行する必要があります。コード全体で利用可能な一定の値を定義することで、メソッドがよりシンプルになり、IDEなどで誤植がキャッチされる可能性があります。 –

1

これはオブジェクトなので、このQPen :: QPen()を使用すると となります。 次に、0の幅を持つデフォルトの黒い実線のペンを作成します。 しかし、オーバーロードされているので、QPenクラスのパラメータを渡して送信したものが処理され、結果が返されるときに、それらのコンストラクタのパラメータを使用できます。 オブジェクト指向の概念です。インスタンス を作成する必要があり、そのインスタンスはそのインスタンスの基礎となる部分を処理します。 2番目の例で使用したような文字列パラメータを使用すると、Qt.QPen()型の代わりに文字列型が使用されます。 setPen()関数は、文字列型の変数ではなくQPen()型のオブジェクトを要求します。 地上階からすべてを書き込む必要はありません。一部はビデオゲームのようにあらかじめ定義されています。ビデオゲームでは、多くの機能を実行することはできません。あなたが誰かを撃つ場合、彼はあなたを撃つか、逃げるように反応があなたの行動に依存します。 アクションはパラメータであり、反応はそのクラスのいずれかの関数からの戻り値です。シーンの背後には、さまざまな作業を行う大量のコードがあります。彼が反応するかどうか、彼が走っているのか歩いているのか、飛んでいるのか飛んでいるのかなどのタイミングは、あなたが特別に変更しない限り、デフォルト値に設定されます。時々あなたはそれらのデフォルト値を変更する必要はありませんか、それは時間がかかるでしょう。その場合は、アクションを渡して反応を得るだけです。それがこれです。複雑なプログラムには本当に便利です。

1

タイプミスやスペルミスがあるとします。たとえば、の代わりにのElipseと書きます。

Qwt.QwtSymbol.Elipseを指定すると、実行前にエラーが検出されます。

あなたは'elipse'のような文字列でコーディングした場合、エラーは、実行時の前にキャッチすることができず、実際にsetSymbolを呼び出すときにのみキャッチされます(そのため、コールがあなたの特定の実行に取ることはありませんelseブランチに表示された場合、エラーが滞在します気づかない)。

もちろん、パフォーマンス上の理由もあります。

このtypingに関する全書籍があります。たとえば、 Ocamlのビットを学び、B.PierceによってTypes and Programming Languagesを読んでください。

this questionも参照してください。

0

私は本当に驚いています。どうして?それは研究努力を示していますか?いいえ!多分OPは研究をしましたが、彼はそれを明らかにしませんでした。それは有用ですか?それは明確ですか?匿名のオブジェクトを渡すことに問題があることは明らかです。しかし、知識を得ることにおける彼の個人的な闘争がなぜ有用なのでしょうか?

単純な点線の灰色の楕円を作るために、スーパーフルーズコードの入力に多くの "労力"をかけなければならない理由は不思議です。 まず、 "Qt"ではオブジェクト指向のフレームワークを使用していることに注意してください。したがって、用語と概念的には、オブジェクトをインスタンス化する一連のクラスを使用しています。タイプと呼ぶものはクラスです。 TYPEQt.PenをsetPenに渡すが、あなたはオブジェクトを定義し

grid.setPen(Qt.Pen)

:あなたは次の操作を実行していない、あなたの例では

。クラスオブジェクトとは異なり、5(= Qt.gray)、0,3(= Qt.DotLine)という個別の値が含まれています。これは単純過ぎることですが、ポイントを家に帰すだけです。

typeintegerのように、このタイプ(クラス)のすべてのオブジェクトには、個別の値自体を含まない整数値を含めることができます。しかし、それはtype(クラス)integerのすべてのインスタンスが整数値を保持しなければならないと定義します。整数変数は、個々の値を持つクラスのインスタンス(オブジェクト)を保持します。

戻るあなたの例に、あなたはクラス(タイプ)QtPenのオブジェクトを作成し、どの処理するために知っているんsetPen方法:

grid.setPen(Qt.QPen(Qt.Qt.gray、0 、Qt.Qt.DotLine))

あなたのオブジェクトはちょうどクラス(タイプ)Qt.Penのものです。だから、あなただけTYPEを渡していませんが、あなたは暗黙的にオブジェクトを明示的に引数として言及三つの値PLUS他有用なもののTONを渡している(例えばCapStyle、miterLimitの、JoinStyle ...)

Pythonでは、引数の暗黙的な型チェックはありません。 (「点線」、「グレー」、0)

grid.setPenを

しかしこの方法では、それはして慣れていて、それらを処理する方法を知っているいくつかのオブジェクトを期待:だから、あなたが提案するもの、渡すことができます。文字列オブジェクトそれは、処理するを知らない。だから、それは何をすべきかを説明するためにあなたの仕事でしょう。そのため、サブクラスQt.Penに、文字列を処理できるコンストラクタ、またはQt.Penクラスを直接変更する必要があります。 QTを後で再コンパイルしてください。

私はQt.Penクラスが最適な例ではないことを認めています。だから、基本的な概念を説明するためのより良い例と、誤った前提のもとでのどこにあるのかを示すことができます。

しかし、最初に私はあなたの「サロゲート」問題がオブジェクト指向のパラダイムを理解するための大きな混乱から生じていると主張しますが、より大きな洞察力の欠如であなたの混乱の原因を見分けることはできませんでした問題。

ローマには多くの道があります。あなたが取る道はあなたのものです。しかし、 "Qt"を使用することを決定したら、すでに一般的な道路セットを決めました。そしてそれらはオブジェクトのために構築されています。

家をいくつか描きたいとします。だから我々は、使用方法をdraw_house定義(ところで、あなたの元の質問で探していたまさにです)magical_drawing_routine

def draw_house(house): 
     magical_drawing_routine(house) 

draw_house('parentshome') 
draw_house('myhome') 

は、今、私たちはドア、窓や美しい煙突なしで正確に二つの同一の描かれた家を得ました親の家の私たちは、正確に二つの同一描かれた家を得た今

def draw_house(door, window, chimney): 
    magical_drawing_routine(door, window, chimney) 

parentshome = ['oak', 'green', 'yes'] 
myhome = ['beech', 'red', 'no'] 
draw_house(parentshome) 
draw_house(myhome) 

:私たちはこれらの不足を修正します戻る製図板へ

(そして、我々は完全にmagical_drawin_routineが文字列値をinterpreteする方法を知っている方法を無視しています)ドア、窓、そして親の家の素敵な煙突があります。しかし、窓とドアはまったく同じ形をしています。戻る製図板に...

一部cylcesた後、あなたのようなものだろう:

def draw_house(doormaterial, doorcolor, doorshape, doorwithglass, doorglassparts, windowsnumber, widnowsdistributionpattern, windowsencassing, windowmaterial, windowshape, windowpattern, windowdecoration, chimney): 
    ... 

または私たちは、クラス定義することができます。適切なデフォルト値でclass House, class Window, class Door, class Chimneyを。

pdoor, mdoor = Door(a,b), Door(a,Z) 
pwin, mwin = Window(e,f,g), Window(e,f,Y) 
pchimney, mchimney = Chimney(h), Chimney(X) 

parentshome = House(pdoor, pwin, pchimney) 
myhome = House(mdoor, mwin, mchimney) 

あなたがあなたの親に一度だけのためにドアを使用している場合、あなたはpdoor定義をforgoeことができ、匿名オブジェクト(なし変数添付)をgerenatingことで、引数を渡すながら、オンザフライオブジェクトをインスタンス化します。 parentshome =ハウス(ドア(...)、...)

したがって、簡単な答えは:あなたはタイプを渡さないオブジェクトを渡します。通常はのカプセル化複雑度です。しかし、ひどいシンプルなオブジェクトの場合、シンプルなものを複雑すぎるように見えるかもしれませんが、それはそのように見えます。

+0

呼び出される関数(例えば 'setPen')は、その引数のすべてのバリエーションについて知っていなければならない(または少なくとも処理しなければならない)ため、正しい答えであるかどうかはわかりません。一部のスクリプト言語(たとえば、* Tcl *は好きではありません)ではほとんどが文字列を受け入れます。 –

関連する問題