มีความคิดเห็นเกี่ยวกับชื่อแทนประเภท / คำพ้องความหมาย?


10

ฉันจะพยายามทำให้ดีที่สุดเพื่อวางกรอบคำถามนี้ในแบบที่ไม่ส่งผลให้เกิดสงครามภาษาหรือรายการเพราะฉันคิดว่าอาจมีคำตอบทางเทคนิคที่ดีสำหรับคำถามนี้

ภาษาที่แตกต่างกันรองรับนามแฝงประเภทเพื่อองศาที่แตกต่าง C # อนุญาตให้พิมพ์นามแฝงประเภทที่จุดเริ่มต้นของไฟล์รหัสแต่ละไฟล์และพวกเขาจะถูกต้องตลอดทั้งไฟล์นั้น ภาษาเช่น ML / Haskell ใช้นามแฝงประเภทอาจจะมากเท่ากับที่ใช้นิยามประเภท C / C ++ มีการเรียงลำดับของ Wild West ด้วยtypedefและ#defineมักจะถูกนำมาใช้แทนกันได้ดูเหมือนกับประเภทนามแฝง

การสร้างสมนามประเภทที่คว่ำไม่ก่อให้เกิดข้อพิพาทมากเกินไป:

  • มันทำให้สะดวกในการกำหนดประเภทคอมโพสิตที่อธิบายไว้ตามธรรมชาติโดยภาษาเช่นหรือtype Coordinate = float * floattype String = [Char]
  • ชื่อแบบยาวสามารถสั้นลงได้: using DSBA = System.Diagnostics.DebuggerStepBoundaryAttribute.
  • ในภาษาเช่น ML หรือ Haskell ที่พารามิเตอร์ฟังก์ชันมักไม่มีชื่อนามแฝงประเภทให้เอกสารของตัวเอง

ข้อเสียคืออีกเล็กน้อย iffy: นามแฝงสามารถขยายทำให้ยากต่อการอ่านและทำความเข้าใจรหัสหรือเรียนรู้แพลตฟอร์ม Win32 API เป็นตัวอย่างที่ดีโดยมีDWORD = intและHINSTANCE = HANDLE = void*รวมถึงLPHANDLE = HANDLE FAR*และอื่น ๆ ด้วย ในทุกกรณีมันไม่เหมาะสมที่จะแยกแยะระหว่างการจับและตัวชี้โมฆะหรือ DWORD และจำนวนเต็มเป็นต้น

การแยกการถกเถียงทางปรัชญาว่ากษัตริย์ควรให้อิสระอย่างเต็มที่กับวิชาของพวกเขาและปล่อยให้พวกเขารับผิดชอบต่อตัวเองหรือไม่หรือว่าพวกเขาควรจะมีการกระทำที่น่าสงสัยทั้งหมดของพวกเขาหรือไม่? บรรเทาความเสี่ยงของการละเมิด

เป็นตัวอย่างปัญหาของชื่อยาวสามารถแก้ไขได้ด้วยคุณสมบัติการเติมข้อความอัตโนมัติที่ดี Visual Studio 2010 จะช่วยให้คุณพิมพ์ DSBA เพื่ออ้างอิง Intellisense กับ System.Diagnostics.DebuggerStepBoundaryAttribute มีคุณสมบัติอื่น ๆ ที่จะให้ประโยชน์อื่น ๆ ของการสร้างนามแฝงประเภทอย่างปลอดภัยหรือไม่?


Intellisense หรือไม่ System.Diagnostics.DebuggerStepBoundaryAttribute มีโค้ดที่อ่านน้อยกว่า DSBA โดยเฉพาะเมื่อใช้บ่อย
zvrba

@zvrba: จริงDebuggerStepBoundaryAttributeมากเพิ่มเติมDSBAอ่านได้มากกว่า ในกรณีแรกคุณรู้ว่ามันหมายถึงอะไร ในอันที่สองคุณไม่มีความคิด ทีนี้ลองจินตนาการว่าคุณใช้นามแฝงยี่สิบแบบในรหัส ใครบ้างมีความกล้าพอที่จะลองอ่านและเข้าใจรหัสของคุณ?
Arseni Mourzenko

คำตอบ:


3

คุณสมบัติสองประการที่อยู่ในใจของฉัน:

ความเบา ในภาษาเช่น C ที่ประเภทข้อมูลintเป็นเฉพาะแพลตฟอร์มนามแฝงเช่นDWORDทำให้ง่ายขึ้นเพื่อให้แน่ใจว่าคุณใช้จำนวนเต็ม 32 บิตที่ลงชื่อจริงทุกที่เมื่อนี่คือข้อกำหนดสำหรับโปรแกรมของคุณแม้ว่าคุณจะย้ายโปรแกรมไปยังตำแหน่งที่intอยู่ เช่น 16bit ไม่ได้ลงนามและดังนั้นจึงจะต้องมีนามแฝงสำหรับDWORDsigned long

สิ่งที่เป็นนามธรรม ในโปรแกรมของคุณคุณอาจใช้จำนวนเต็มและจำนวนทศนิยมสำหรับวัตถุประสงค์ที่แตกต่างกัน โดยการสร้างชื่อแทนเช่นSPEED, HEIGHT, TEMPERATUREมันค่อนข้างง่ายที่จะเปลี่ยนหนึ่งในบรรดาเช่นจากfloatไปdoubleและปล่อยให้คนอื่น ๆ ที่พวกเขาเป็น


แต่นั่นไม่ได้ตอบคำถาม ...
Rei Miyasaka

@Rei คุณพูดถูกว่า ammoQ ไม่ได้ตอบคำถาม แต่ให้ความเห็นจริงๆ อย่างไรก็ตาม P.SE ไม่อนุญาตให้มีการแสดงความคิดเห็นในรูปแบบหรือยาว ... ฉันคิดว่าเขาไม่สมควรได้รับการโหวต: ความคิดเห็นของเขาอยู่ในหัวข้อและเป็นสิ่งที่ดี
Ando

@ Andrea ดูเหมือนจะไม่เป็นผลมาจากการอ่านคำถามทั้งหมด นอกเหนือจากหมายเหตุเกี่ยวกับการพกพา (ซึ่งเป็นเพียงรายการอื่นที่จะใส่ในรายการของ upside) มันเป็นเพียงการกล่าวซ้ำ
Rei Miyasaka

2

ฉันเห็นด้วยกับเอนเดรียที่คุณต้องการการห่อหุ้ม แต่ฉันไม่เห็นด้วยที่จะต้องมีราคาแพง

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

เช่นปัญหาหลักที่ฉันเห็นด้วย typedefs เป็นจำนวนมากในภาษาคือพวกเขาไม่ได้แนะนำรูปแบบใหม่ แต่เพียงนามแฝงในขณะที่สิ่งนี้มีประโยชน์มันไม่เป็นประโยชน์เช่นเดียวกับรูปแบบใหม่ซึ่งเหมือนแบบเก่า แต่มีรูปแบบใหม่ ชื่อ. และการจัดองค์ประกอบหรือการสืบทอดนั้นหนักเกินไปถ้าคุณต้องการให้แน่ใจว่าคุณไม่ได้ผสมตัวแปรสองสามอย่าง


1
ฉันไม่เห็นด้วยมากกว่านี้ฉันอยากเห็นความแตกต่าง "จำกัด " ประเภทนี้ หากtype Name = Stringแล้วStringไม่สามารถส่งผ่านไปยังฟังก์ชั่นคาดว่าจะได้Nameแต่กลับเป็นไปได้
Matthieu M.

1

ฉันคิดว่านามแฝงประเภทให้โปรแกรมเมอร์ที่ขี้เกียจ (มาก) การห่อหุ้มราคาถูก ดังนั้นทางเลือกอาจเป็นเพียงการใช้การห่อหุ้ม (ราคาแพง) ที่เหมาะสม

นอกจากนี้ยังมีข้อโต้แย้งว่าอดีตยังเหมาะสำหรับเครื่อง / ภาษาที่ใช้งานมากกว่าหลัง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.