Mengapa fitur konversi tipe otomatis Eiffel tidak lebih populer?

Apa yang terjadi pada saya saat memprogram di Java:

String str

// want to call something(), but signature does not match
something(Foo foo)

// but I have this conversion function
Foo fooFrom(String)

// Obviously I am about to create another method overload.. sigh
something(String s) {
    something(fooFrom(s));
}

Tapi kemudian saya memikirkan kemungkinan "konversi tipe otomatis" yang hanya menggunakan fungsi konversi yang saya tentukan fooFrom setiap kali string diteruskan di mana objek Foo dikecualikan.

Penelusuran membawa saya ke laman wikipedia tentang konversi jenis dengan contoh Eiffel ini:

class STRING_8
    …
create
    make_from_cil
    …
convert
    make_from_cil ({SYSTEM_STRING})
    to_cil: {SYSTEM_STRING}
    …

Metode setelah convert dipanggil secara otomatis jika STRING_8 digunakan sebagai SYSTEM_STRING dan sebaliknya. Entah bagaimana mengejutkan bagi saya, saya tidak dapat menemukan bahasa lain yang mendukung ini.

Jadi pertanyaan saya: apakah ada bahasa lain yang mendukung fitur ini? Jika tidak, apakah ada alasannya, karena menurut saya ini cukup berguna? Lebih lanjut saya pikir tidak akan sulit untuk mengimplementasikannya sebagai tambahan bahasa.


person sevenforce    schedule 05.11.2012    source sumber


Jawaban (4)


Ada satu hal kecil yang mungkin membuat segalanya menjadi lebih rumit. Saat ini Eiffel memiliki aturan bahwa konversi hanya dapat diterapkan ketika sumber pemasangan kembali melekat pada suatu objek, yaitu tidak Void (bukan null di Java/C#) .

Mari kita lihat contoh aslinya:

something (str);

Misalkan str adalah null. Apakah kita mendapatkan NullPointerException / InvalidArgumentException, karena kodenya diubah menjadi

something (fooFrom (str));

dan fooFrom tidak mengharapkan null? Atau apakah kompiler cukup pintar untuk mengubahnya menjadi

if (str == null)
    something (null);
else
    something (fooFrom (str));

?

Standar Eiffel saat ini memastikan bahwa masalah seperti itu tidak terjadi dan str tidak null jika melibatkan konversi. Namun banyak bahasa lain seperti Java atau C# tidak menjamin hal tersebut dan kerumitan tambahannya mungkin tidak sepadan dengan usaha mereka.

person Community    schedule 06.11.2012

Saya percaya bahwa Eiffel bukan satu-satunya bahasa yang mendukung rutinitas konversi, tetapi menurut saya bahasa ini mungkin salah satu dari sedikit bahasa yang mengintegrasikannya dengan baik dengan definisi bahasa lainnya.

Di .NET, misalnya, Anda memiliki rutinitas op_Explicit dan op_Implicit yang dapat digunakan untuk konversi bahasa yang mendukungnya. Dan saya yakin C# melakukannya.

Manu

person Emmanuel Stapf    schedule 06.11.2012

Pemaksaan tipe (konversi implisit) adalah kutukan dan berkah--berguna dalam beberapa kasus, namun itu juga bisa menjadi bumerang.

Misalnya, Javascript memiliki banyak aturan pemaksaan yang aneh, yang dapat menyebabkan bug ketika memaksa string ke angka, dll.

Scala memiliki sesuatu yang disebut "implisit" yang mencapai sesuatu yang serupa (setidaknya bagi saya) dengan apa yang Anda gambarkan di Eiffel. Tanpa diduga, hal ini dapat menyebabkan gotchas tertentu. Namun mereka juga bisa sangat berguna, lihat misalnya artikel Pimp Perpustakaanku.

person ewernli    schedule 06.11.2012

C++ memiliki konstruktor penyalinan dan operator penugasan.

person cyco130    schedule 09.11.2012