Tür takma adları / eş anlamlıları hakkındaki düşünceler?


10

Bu soruyu bir dil savaşı veya listeye yol açmayacak şekilde çerçevelemek için elimden geleni yapacağım, çünkü bu sorunun iyi ve teknik bir cevabı olabileceğini düşünüyorum.

Farklı diller, tür takma adlarını değişen derecelerde destekler. C #, tür takma adlarının her kod dosyasının başında bildirilmesine izin verir ve yalnızca bu dosya boyunca geçerlidir. ML / Haskell gibi diller muhtemelen tür tanımlarını kullandıkları kadar tür takma adları kullanır. C / C ++, bir tür Vahşi Batı'dır typedefve #definegenellikle takma ad türleriyle birbirinin yerine kullanılabilir gibi görünür.

Tür örtüşmesinin üst tarafları çok fazla anlaşmazlığa neden olmaz:

  • Dille doğal olarak tanımlanan bileşik türlerin tanımlanmasını kolaylaştırır, örn . , type Coordinate = float * floatVeya type String = [Char].
  • Uzun isimler kısaltılabilir: using DSBA = System.Diagnostics.DebuggerStepBoundaryAttribute.
  • İşlev parametrelerinin genellikle adlarının bulunmadığı ML veya Haskell gibi dillerde, tür takma adları kendi kendini belgeleme bir görünüm sağlar.

Dezavantajı biraz daha havalı: takma adlar çoğalabilir, bu da kodu okumayı ve anlamayı veya bir platformu öğrenmeyi zorlaştırabilir. Win32 API, onun DWORD = intve onun HINSTANCE = HANDLE = void*ve onun LPHANDLE = HANDLE FAR*gibi iyi bir örnektir . Tüm bu durumlarda, bir HANDLE ile bir geçersiz işaretçi veya bir DWORD ile bir tam sayı vb. Arasında ayrım yapmak pek mantıklı değildir.

Bir kralın konularına tam özgürlük verip vermemeleri ve kendilerinden sorumlu olmalarına izin verip vermemeleri ya da tüm şüpheli eylemlerine müdahale edip etmemeleri konusunda felsefi tartışmayı bir kenara bırakarak, tür yumuşatmanın faydalarına izin verecek mutlu bir ortam olabilir mi? kötüye kullanım riskini hafifletiyor mu?

Örnek olarak, uzun isimler sorunu iyi otomatik tamamlama özellikleri ile çözülebilir. Visual Studio 2010, Intellisense System.Diagnostics.DebuggerStepBoundaryAttribute başvurmak için DSBA yazmanıza izin verir. Tür örtüşmesinin diğer faydalarını daha güvenli bir şekilde sağlayacak başka özellikler olabilir mi?


Intellisense ya da değil, System.Diagnostics.DebuggerStepBoundaryAttribute, özellikle sık kullanıldığında, DSBA'dan çok daha az okunabilir.
zvrba

@zvrba: aslında, DebuggerStepBoundaryAttributeçok daha okunabilir DSBA. İlk durumda, bunun ne anlama geldiğini biliyorsunuz. İkincisinde, hiçbir fikrin yok. Şimdi kodda bunun gibi yirmi farklı takma ad kullandığınızı düşünün. Kodunuzu okumak ve anlamak için yeterli cesaretiniz var mı?
Arseni Mourzenko

Yanıtlar:


3

Aklıma iki özellik geliyor:

Taşınabilirlik. Datatypes gibi C gibi dillerde intplatforma özel, benzeri bir takma olan DWORDbu program için bir gerekliliktir daha kolay gerçekten her yerde tamsayı imzalanmış bir 32bit kullandığınızdan emin olmak için yapar, plattform için bile noktası programı intolan örneğin 16bit imzasız ve bu nedenle DWORDiçin bir takma ad olmalıdır signed long.

Soyutlama. Programınızda, farklı amaçlar için çok sayıda tamsayı ve kayan nokta sayısı kullanabilirsiniz. Gibi adlar oluşturarak SPEED, HEIGHT, TEMPERATURE, bu gelenler mesela birini değiştirmek için nispeten kolay floatiçin doubleve oldukları gibi başkalarını bırakın.


Bu soruya cevap vermiyor ...
Rei Miyasaka

@Rei, ammoQ'nun soruyu cevaplamadığı, ancak gerçekten yorumladığı haklısınız. Yine de, P.SE biçimlendirilmiş veya uzun yorumlara izin vermiyor ... Bence bir aşağı oyu hak etmiyor: yorumu konu ve iyi bir konu.
Ando

@Andrea, soruyu bütünüyle okumanın bir sonucu gibi görünmüyor; taşınabilirlik ile ilgili notun yanı sıra (bu, yukarı taraflar listesine koymak için sadece bir başka öğedir), bu sadece bir yeniden ifade.
Rei Miyasaka

2

Andrea'ya katılıma ihtiyacınız olduğunu kabul ediyorum, ancak bunun pahalı olması gerektiğini kabul etmiyorum.

Bence Mutlu ortam, muhtemelen gerçek tip ve typedef arasında açık dönüşüme izin veren, ancak örtülü dönüşümü engelleyen güvenli tip typedefler olurdu.

yani birçok dilde typedefs ile gördüğüm ana sorun aslında yeni bir tür değil, sadece bir takma ad tanıtmaktır, bu yararlı olsa da, eski tür gibi yeni bir tür kadar yeni değil, yeni bir adlandırın. Ve sadece birkaç değişkeni karıştırmamanızı istiyorsanız kompozisyon veya kalıtım çok ağırdır.


1
Daha fazla anlaşamadım, gerçekten bu tür bir "sınırlı" polimorfizm görmek istiyorum. Eğer type Name = String, o zaman a Stringbeklenen a fonksiyonuna geçirilemez Name, ancak bunun tersi mümkündür.
Matthieu M.

1

Tip takma adların tembel programcıya (çok) ucuz kapsülleme verdiğini düşünüyorum. Belki de alternatif sadece uygun (pahalı) kapsülleme kullanmak olabilir.

Bununla birlikte, birincisinin, kullanılan makine / dil için ikincisine göre çok daha optimize edilmiş olduğu iddiası da vardır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.