web-dev-qa-db-ja.com

緩やかに型付けされた言語は、真のオブジェクト指向と見なすことができますか?

PHPのような緩く型付けされたプログラミング言語は、本当にオブジェクト指向であると考えられますか?

つまり、メソッドには戻り値の型がなく、メソッドパラメーターにも型が宣言されていません。

クラスの設計では、メソッドに戻り値の型が必要ですか?メソッドシグネチャには、特別に型指定されたパラメータがないのですか?

OOPテクニックは、言語が型を強制しないため、受け取ったパラメーターの型を常に確認する必要がある場合、PHPでコーディングするのに役立ちます。

私が間違っている場合は、それを説明してください。

MLを使用して設計する場合、PHPで戻り値の型付きのメソッドや型のないパラメーターを使用してコードクラスを記述してください...コードはUML設計に本当に準拠していますか?

ソフトウェアアーキテクチャの設計に時間を費やした場合、コンパイラーはプログラマーにコーディング中の設計を強制せず、「型の不一致」の警告なしにオブジェクト変数を他の変数に割り当てることができます。

6

OOPの古典的な属性は、継承、ポリモーフィズム、およびカプセル化です。厳密な型指定についての言及はありません。

私はPHPを知りませんが、OOP Pythonとコーディングしましたが、OOP C#のように感じます。

17
dave

クラスの設計では、戻り値の型を持つためのメソッドが必要ではありませんか?

どうして?実行時にコード自体を変更するわけではないため、メソッドは、事前宣言されているかどうかにかかわらず、戻り値の型を持っています。強制できないからといって、それが存在しないという意味ではありません。コード自体から明らかに推測できます。

メソッドシグネチャには、特別に型指定されたパラメータはありませんか?

繰り返しますが、メソッドが受け取るものを単純に自由にすることはできないということは言うまでもありません。 IDでユーザーを取得しますか?もちろん、文字列または整数を渡します。それはどのようにオブジェクト指向プログラミングを壊しますか?

OOPテクニックは、PHPでコードを作成するのに役立ちます。言語が型を強制しないため、受信したパラメータの型を常にチェックする必要がある場合

ここでは、上記の引数に基づいて、「追加のチェック」が必要な場合でもOOPテクニックを無力にする理由を確認できませんでした。

私がよく知っている緩く型付けされた言語には method overloading がありません。これは、(同じ名前を使用しながら)入力でメソッドをより柔軟にするためによく使用されるため、多くを見ることができません。 1つの方法と「追加のチェック」を使用する場合との違い。勤勉な開発者は、緩やかに型付けされた言語で同じコントラクト、安定性、およびセキュリティを備えた同じメソッドを書くことができます。

UMLを使用して設計する場合、PHPでクラスをコード化し、戻り値の型付きメソッドや型なしのパラメーターを使用しないでください...コードはUML設計に本当に準拠していますか?

これはメソッド自体に依存しますね。入力で実際に何をし、何を出力するのですか?

入力はまだ存在します

一番下の行は、タイプはまだ存在し、それらはlooseまたはweak1、そしてこれらのシステムは 特定の利点さえあります です。

実際、JetBrains(IntelliJ、PHPStorm)のような一部のIDEは、あらゆる種類の PHPのPHPDocsを使用したヒント をサポートしています。私が使用してきたように、IDE強く型付けされた場合に提供される可能性のある便利な警告、クリックスルー、コード補完などのほとんどすべてを提供します。


1:「緩い」と「弱い」はどちらにしても、グループ化が不十分です。非常に多くの異なる型システムがあるため、これらの用語は混乱を招く可能性があります。スタックオーバーフローの Eric Lippertによるこのトピックに関する有益な視点 を参照してください。


メソッドドキュメントとインラインの例

/**
 * @static
 * @param mixed $id
 * @return User
 */
public function getUserById($id) {
    ....
}

public function printUserName() {
    // code completion provided on getName method because of @return
    $name = $this->getUserById("5")->getName();

    // type hinting for arrays
    /** @var User[] $users */
    $users = array(new User());
}

鋳造例

public function checkUser(User $user) {
    if ($user instanceof Administrator) {
        /** @var Administrator $admin  */
        $admin = $user;
        $admin->logAccess();
    }
}
8
Nicole

Alan Keyがコンセプトを導入した元のオブジェクト指向言語は Smalltalk でした。動的に型付けされます。

実際、アラン・キーはC++のクラスとインターフェースのアプローチに言及し、Javaはではない彼が発明したときに彼が考えていたものですオブジェクト指向プログラミングですから、静的型付け言語が本当にオブジェクト指向であるかどうかという疑問はおそらく逆になるはずです。

つまり、メソッドには戻り値の型がなく、メソッドパラメーターにも型が宣言されていません。クラスの設計では、戻り値の型を持つためのメソッドが必要ではありませんか?メソッドシグネチャには、特別に型指定されたパラメータがないのですか?

いいえ、特にtypedパラメーターはありません。それらのパラメーターと戻り値には、特定のメソッドのセットが必要ですが、特定のタイプである必要はありません。インターフェイスを宣言することによって強制される静的に型付けされた言語。動的に型付けされたものでは、文書化するだけです。

OOPテクニックは、言語が型を強制しないため、受け取ったパラメーターの型を常にチェックする必要がある場合、PHPでコーディングするのに役立ちます。

受け取ったパラメータのタイプは決して確認しないでください。単にそれらのメソッドを呼び出す必要があります。これは「アヒルのタイピング」と呼ばれます(アヒルのようにくしゃくしゃにしてアヒルのように歩く場合、私はそれをアヒルと呼びます。または、Xのようなメソッドがあれば、Xのために機能します)。これは、Smalltalk、Perl、python、Rubyなど)で通常行われる方法であり、PHPで行う必要があります。

5
Jan Hudec

クラスの設計では、戻り値の型を持つためのメソッドが必要ですか?

あんまり。

メソッドシグネチャには、特別に型指定されたパラメータはありませんか?

承知しました。コンパイラーによって型が強制されないからといって、メソッドが必要とする/実装する暗黙のコントラクトとセマンティクスがないという意味ではありません。

OOPテクニックは、PHPでコードを作成するのに役立ちます。言語が型を強制しないため、受信したパラメータの型を常にチェックする必要がある場合

オブジェクト指向プログラミングに焦点を当てます。繰り返しになりますが、設計で動的言語の暗黙のコントラクトをどのように整理するかが、OOが関係するところです。

3
Telastyn