เหตุใดคุณสมบัติการแปลงประเภทอัตโนมัติของไอเฟลจึงไม่ได้รับความนิยมมากกว่า

เกิดอะไรขึ้นกับฉันขณะเขียนโปรแกรมใน 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));
}

แต่แล้วฉันก็นึกถึงความเป็นไปได้ของ "การแปลงประเภทอัตโนมัติ" ซึ่งเพิ่งใช้ฟังก์ชันการแปลงที่กำหนดไว้ของฉัน fooFrom ทุกครั้งที่ส่งสตริงโดยที่ยกเว้นวัตถุ Foo

การค้นหาของฉันนำฉันไปยังหน้าวิกิพีเดียเกี่ยวกับการแปลงประเภทพร้อมตัวอย่างไอเฟลนี้:

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

วิธีการหลัง convert จะถูกเรียกโดยอัตโนมัติหากใช้ STRING_8 เป็น SYSTEM_STRING และในทางกลับกัน น่าแปลกใจสำหรับฉันฉันไม่สามารถหาภาษาอื่นที่สนับสนุนสิ่งนี้ได้

ดังนั้นคำถามของฉัน: มีภาษาอื่น ๆ ที่รองรับฟีเจอร์นี้หรือไม่? ถ้าไม่ มีเหตุผลใดบ้างในเรื่องนี้เนื่องจากดูเหมือนว่ามีประโยชน์มากสำหรับฉัน นอกจากนี้ ฉันคิดว่าการนำมันเป็นส่วนเสริมภาษาคงไม่ใช่เรื่องยาก


person sevenforce    schedule 05.11.2012    source แหล่งที่มา


คำตอบ (4)


มีประเด็นเล็กๆ น้อยๆ ประการหนึ่งที่อาจทำให้สิ่งต่างๆ ซับซ้อนขึ้นเล็กน้อย ในขณะนี้ ไอเฟลมีกฎว่าการแปลงสามารถใช้ได้เฉพาะเมื่อมีการแนบแหล่งที่มาของการแนบใหม่เข้ากับออบเจ็กต์ กล่าวคือ ไม่เป็น เป็นโมฆะ (ไม่ใช่ null ใน Java/C#) .

ลองดูตัวอย่างดั้งเดิม:

something (str);

สมมติว่า str เป็น null เราได้รับ NullPointerException / InvalidArgumentException หรือไม่ เนื่องจากโค้ดถูกแปลงเป็น

something (fooFrom (str));

และ fooFrom ไม่คาดหวัง null? หรือคอมไพเลอร์ฉลาดพอที่จะแปลงสิ่งนี้เป็น

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

?

มาตรฐานไอเฟลในปัจจุบันทำให้แน่ใจว่าปัญหาดังกล่าวจะไม่เกิดขึ้น และ str จะไม่ null หากเกี่ยวข้องกับการแปลง อย่างไรก็ตาม ภาษาอื่นๆ อีกหลายภาษา เช่น Java หรือ C# ไม่รับประกันสิ่งนั้น และความซับซ้อนเพิ่มเติมอาจไม่คุ้มค่ากับความพยายามสำหรับภาษาเหล่านั้น

person Community    schedule 06.11.2012

ฉันเชื่อว่าไอเฟลไม่ใช่ภาษาเดียวที่สนับสนุนกิจวัตรการแปลง แต่ฉันจะบอกว่ามันอาจจะเป็นหนึ่งในไม่กี่ภาษาที่รวมสิ่งนี้เข้ากับคำจำกัดความของภาษาที่เหลือได้อย่างลงตัว

ตัวอย่างเช่น ใน .NET คุณมีทั้งรูทีน op_Explicit และ op_Implicit ที่สามารถใช้สำหรับการแปลงสำหรับภาษาที่รองรับ และฉันเชื่อว่า C# ทำได้

มนู

person Emmanuel Stapf    schedule 06.11.2012

การบังคับพิมพ์ (การแปลงโดยนัย) ถือเป็นคำสาปและเป็นพร ซึ่งมีประโยชน์ในบางกรณี แต่ มันยังสามารถส่งผลย้อนกลับได้

ตัวอย่างเช่น Javascript มีกฎการบังคับแปลกๆ มากมาย ซึ่งอาจนำไปสู่ข้อผิดพลาดเมื่อบังคับสตริงเป็นตัวเลข เป็นต้น

สกาล่า มีสิ่งที่เรียกว่า "โดยนัย" ซึ่งให้ผลลัพธ์ที่คล้ายกัน (อย่างน้อยสำหรับฉัน) กับสิ่งที่คุณอธิบายในไอเฟล โดยไม่แปลกใจเลยที่สิ่งเหล่านี้อาจนำไปสู่ ​​gotchas บางอย่างได้ แต่ก็มีประโยชน์มากเช่นกัน ดูตัวอย่างบทความ Pimp My Library.

person ewernli    schedule 06.11.2012