4

弱い型を推奨しないのはいつですか? 大きなプロジェクトでは弱い型は推奨されませんか? 左側が次のように強く型付けされている場合、それは規則の例外になりますか?

   int i = 5
   string sz = i
   sz = sz + "1"
   i  = sz

上記と同様の構文をサポートする言語はありますか? 弱い型と関連する状況の長所と短所について詳しく教えてください。

4

7 に答える 7

3

弱い型付けは、言語を単純化する試みです。これは価値のある目標ですが、弱い型付けは不十分な解決策です。

COM Variants で使用されているような弱い型付けは、この問題を解決するための初期の試みでしたが、危険をはらんでおり、率直に言って、その価値よりも多くの問題を引き起こしています。あらゆる種類のくだらないことを我慢する Visual Basic プログラマーでさえ、これを悪い考えとして正しく認識し、Microsoft の ETC (Extended Type Conversion) を Evil Type Cast と呼びました。

推論された型付けと弱い型付けを混同しないでください。推論型付けは、コンパイル時にコンテキストから推論される強力な型付けです。良い例はvar、LINQ 式の値を受け取るのに適した変数を宣言するために C# で使用されるキーワードです。

対照的に、弱い型付けは、式が評価されるたびに推論されます。これは、質問のサンプル コードに示されています。もう 1 つの例は、C での型指定されていないポインターの使用です。非常に便利ですが、問題が発生する可能性があります。

推論された型付けは、弱い型付けに関連する問題を導入することなく、弱い型付けと同じ問題に対処します。したがって、ホスト言語で使用できる場合は常に、代替として推奨されます。

于 2009-02-28T09:35:23.243 に答える
2

"

弱い型を推奨しないのはいつですか? 大きなプロジェクトでは弱い型は推奨されませんか? 左側が次のように強く型付けされている場合、それは規則の例外になりますか?

int i = 5 string sz = i sz = sz + "1" i = sz

上記と同様の構文をサポートする言語はありますか? 弱い型と関連する状況の長所と短所について詳しく教えてください。

"

おそらく、独自のライブラリをプログラムしてそれを行うことができます。

C++ では、「演算子のオーバーロード」と呼ばれるものを使用できます。これは、ある型の変数を別の型の変数として初期化することを宣言できることを意味します。それが次のような声明です。

[std::string str = "Hello World";][1]

具体的には、関数を定義します(変数の型は T で、B は設定したい型です)

引用符の間のテキストは文字の配列として解釈されますが、機能します。

T& T::operator= ( const B s );

これはクラスのメンバー関数であることに注意してください。また、自由に使用したい場合は、この操作を逆にするある種の関数が必要になることに注意してください。

B& T::operator= ( const T s);

C++ は、一般に弱い型付けのオブジェクトを作成できるほど強力ですが、純粋に弱い型付けを扱いたい場合は、任意のプリミティブとして使用できる単一の変数型だけを作成し、次の値を取る関数のみを使用する必要があります。 void へのポインター。私を信じてください。強く型付けされたプログラミングが利用可能であれば、それを使用する方がはるかに簡単です。

個人的には、厳密に型指定された方が好きです。変数の意味がわからない場合に発生するエラーを心配する必要がないからです。たとえば、ある人物と話す関数を書きたい場合、その関数はその人物の身長、体重、名前、子供の数などを使用しますが、色を指定すると、エラーが発生します。非常に単純なアルゴリズムを使用して、色についてこれらのことのほとんどを実際に決定することはできません。

弱い型付けの長所に関しては、プログラム (つまり、Web ブラウザーまたは UNIX シェル) 内で実行する何かをプログラミングしている場合は、緩やかに型付けされたプログラミングに慣れたいと思うかもしれません。JavaScript とシェル スクリプトは弱い型付けです。

アセンブリ言語のようなプログラミング言語は、ハードウェア レベルの弱い型付け言語の 1 つであることをお勧めしますが、私が見たアセンブリ言語のフレーバーは、割り当てられたサイズ、つまり word、dword、qword に応じて各変数に型を付加します。 .

私はあなたに良い説明をして、あなたの口に言葉を入れなかったことを願っています.

于 2012-03-06T02:10:30.033 に答える
1

上記と同様の構文をサポートする言語はありますか?

Perl では、一部の数値と文字列を同じように扱うことができます。たとえば、"5" + "1" は 6 を返します。一般にこの種の問題は、あいまいさを避けるのが難しいことです: "5" + 1 は "51" または "6" である必要がありますか? Perl は、文字列連結用に別の演算子を用意し、数値加算用に + を予約することで、これを回避しています。

他の言語は、連結または加算を行うつもりかどうか、および (関連する場合) 結果がどのような型または表現になるかを整理する必要があります。

于 2009-03-08T03:39:17.727 に答える
1

弱い型は、その性質上、強い型よりも堅牢性が低くなります。これは、マシンに何をすべきかを正確に伝えないためです。代わりに、マシンは何を意味するかを理解する必要があります。多くの場合、これは十分に機能しますが、一般的に、結果がどうなるかは明確ではありません。たとえば、浮動小数点数を掛けた文字列とは何ですか?

于 2009-02-28T07:31:43.727 に答える
0

私は ASP/VBScript コーディングを行い、弱い型付けを可能にする "option strict" を使用せずにレガシー コードを操作しました。

多くの場合、特に経験の浅いプログラマーの手にかかると、それは地獄でした。ばかげたエラーはすべて診断に時間がかかります。

愚かな例の1つは次のようなものでした:

'Config 
    Dim pass
    pass = "asdasd"


If NOT pass = Request("p") Then
Response.Write "login failed"
REsponse.End()
End If

これまでのところは問題ありませんが、ユーザーが pass を整数のパスワードに変更すると、int pass != string pass (querystring から) になるため、機能しなくなると思います。うまくいくはずだと思ったのですが、うまくいきませんでした。コードの正確な部分を思い出せません

愚かなデバッグセッションの代わりに、変数の正確な型を入力するために余分な時間を費やすことができます。

簡単に言えば、私の経験では、特に大きなプロジェクトで、特に経験の浅い開発者にとっては、ただのトラブルです。

于 2009-02-28T10:50:55.543 に答える