Saf sanal veya soyut, bir ismin ne var?


15

Stack Overflow'daki sanal işlevler hakkında bir soru tartışırken , saf (soyut) ve saf olmayan sanal işlevler için herhangi bir resmi adlandırma olup olmadığını merak ettim.

Saf ve saf olmayan sanal işlevlerin genel terim olduğunu belirten bilgilerim için her zaman wikipedia'ya güveniyordum . Ne yazık ki, makale bir kaynak veya referanslarla desteklemiyor.

Jon Skeet'in saf ve saf olmayan genel terim olduğu cevabımın cevabını alıntılamak için:

@Steven: Hmm ... muhtemelen, ama daha önce C ++ bağlamında gördüm. Herkes onlar hakkında konuşurken şüpheli bir C ++ arka plan var :)

Terimler C ++ kaynaklı mı yoksa ilk olarak daha önceki bir dilde mi tanımlanmış veya uygulanmışlardı ve bunlar 'resmi' bilimsel terimler mi?

GÜNCELLEME:

Frank Shearar, SIMULA 67 Ortak Temel Dilinin (1970) açıklamasına bir bağlantı sağladı . Bu dil, sınıf , nesne olarak OO anahtar kelimelerini ve resmi bir kavram olarak sanal olan ilk dil olarak görünmektedir . O değil tanımlamak / saf olmayan saf veya soyut , ama o kavramları bünyesinde barındırmakta .

Onları kim tanımladı?



2
sanal işlevler, sanal kalıtım, sanal tablolar - hiçbiri onları "sanal" yapan şeyin gerçek açıklamasıyla. Kuralları biliyorum ama neden bu kelime? Sonuçta, bir "sanal" fonksiyon diğer herhangi bir fonksiyon kadar gerçektir - sadece geç bağlama arayışı gerektirir, hepsi bu. Belki Stroustrup kelimeyi gerçekten sevmişti. Sınıfların soyut (saf değil) olduğunu düşünürken, yöntemler saf (ama soyut değil) olabilirdi. Yine de uydurdum.
Steve314

3
Steve314 @, o Stroustrup değildi - görünüşe zaten böyle çağrıldı Simula .
Péter Török

Yanıtlar:


9

Nygaard ve Dahl bu terimi ilk kez SIMULA 67 Ortak Temel Dilinde kullandılar . Örneğin bölüm 2.1'e ve bölüm 2.2.3'e bakınız. (En azından söyleyebildiğim kadarıyla. Ama hey, OOP ile ilgili olarak, muhtemelen terimin ilk kullanımı.)


3
Simula ilk OO diliydi, AFAIK, bu yüzden bir OOP bağlamında birçok terimin ilk kullanımına sahipti. Başlangıçta sadece C verimliliği ve Simula sınıfları olan bir dil isteyen Stroustrup'u büyük ölçüde etkiledi.
David Thornley

Bu makaleyi gözden kaçırıyorum ve evet, 'sınıfları' ve 'nesneleri' tanıttıkları için ilk görünüyor.
Steven Jeuris

2
Böylece, bir süre sonra SIMULA 67 tanımını okuduktan sonra. Simula 67, 1970'de 'sınıf', 'nesne', 'gizli', 'değere göre çağrı', 'referans ile çağrı' ile birlikte 'sanal' kelimesini üretti. 'Saf', 'saf' veya 'soyut' belirtisi yok.
Steven Jeuris

5
"Boşa", alanın seminal gazetelerinden birini okumayı tanımlamak için kullanılan garip bir kelime gibi görünüyor.
Frank Shearar

7

Yani ... Biraz araştırma yapıyorum. Aşağıda ilgilenenler için küçük bir tarih dersi var. :) Sadece cevapla ilgileniyorsanız, alttaki sonuca atlayın.

1967 :

İlk nesne yönelimli programlama dili olan SIMULA 67 , anahtar kelimeleri sınıf , nesne , referans ile arama, değere göre arama ve sanal olarak tanımlar .

SIMULA'nın miras sistemi, farklı bir ad, birleştirme (ve daha sonra önek olarak bilinir) tarafından biliniyordu ; üst tür kodların kopyalanıp alt türlerin koduyla "birleştirildiği" gerçeğine atıfta bulundu. Daha sonra başka bir miras sistemi ortaya çıktı, delegasyon , burada çağrılar doğru tipe atıfla delege edildi.

Sanal, büyük olasılıkla bir sanal yöntem tablosu kullanarak doğru uygulamaya çağrı göndermek için yapılması gereken işlemi ifade eder . Sabit / somut bir uygulamaya kıyasla sanaldır.

1971 :

Niklaus Wirth, Kademeli Arıtma olarak tanımlanan bir konsept hakkında yazıyor . Temel olarak, bir programın genişletilebilecek kısmi çözümlere nasıl bölüneceğini açıklar.

1974 :

Bu SikkeIerin terim buldum erken kağıdıdır soyut veri türlerini tarafından Barbara Liskov .

Soyut bir veri türü, tamamen bu nesneler üzerinde mevcut olan işlemlerle karakterize edilen bir soyut nesne sınıfını tanımlar. Bu, soyut bir türün, o tür için karakterizasyon işlemleri tanımlanarak tanımlanabileceği anlamına gelir. Bir programcı soyut bir veri nesnesini kullandığında, yalnızca o nesnenin sergilediği davranışla ilgilenir, ancak bu davranışın bir uygulama yoluyla nasıl elde edildiğine dair herhangi bir ayrıntıyla ilgilenmez.

Bu makale aynı zamanda şimdi arayüz olarak bildiğimiz şeyi belirten bir işlem kümesini de tanımlamaktadır .

İlginç bilimsel terminoloji (1996 tarihli makale):

Kalıtım : nesnelerin veya sınıfların davranış veya verileri paylaşabileceği daha düşük düzeyli bir mekanizma.

Alt tipleme : kavramsal uzmanlığı ifade eder. Arayüz kalıtım olarak da adlandırılan belirli bir kalıtım biçimi .

Soyutlama ilkeleri : İlgili alanın daha iyi anlaşılmasını sağlamak için bir uygulama alanı hakkındaki bilgimizi, soyutlamaların sıralaması hiyerarşik sıralarına göre düzenleme süreci.

Kısmen uygulanan soyutlamalar : tanımları bilerek eksik kalan soyutlamalar.

Soyut sınıflar : Nesne yönelimli sistemlerde kısmen uygulanan bir sınıf için özel terim .

Sınırsız kalıtım : İşlemlerin alt sınıflarda yeniden tanımlanmasını (veya hatta kaldırılmasını) sağlar.

Katı kalıtım : Davranışsal olarak uyumlu kalıtım.

Sonuç :

Soyut sınıf , nesne yönelimli sistemlerde kullanılan en genel terimdir. Öyle görünüyor saf dışı saf sanal fonksiyonlar sadece C ++ kaynaklanmaktadır. Örneğin, Stroustrup ile yapılan bu röportaj , terimleri icat ettiğini gösteriyor. Bilimsel makaleler daha genel terminoloji kullanır.

Sanal , kullanımının yaygın olmasına neden olan SIMULA'dan kaynaklanır, ancak genel bir terim değildir. Uygulama ayrıntılarını zaten tanımlar. Kalıtım türleri açısından konuşmak daha uygundur. Varsayılan olarak sanal olmayan , varsayılan olarak katı mirasa karşılık gelirken , varsayılan olarak sanal olmayan sınırsız mirasa karşılık gelir .

Wikipedia girişini ayarlamak isteyen var mı? :)


Barbara Liskov'dan önce, Dijkstra'nın "STEP-WISE PROGRAM KOMPOZİSYONU" nda da ilgili bir kaynak olabileceği söylenecek bir şey vardı .
Steven Jeuris

4

C ++ 'da, dinamik olarak bağlı olan ve bu nedenle bir alt sınıf tarafından geçersiz kılınabilen üye işlevlerine "sanal" denir. Kesinlikle geçersiz kılınması gereken sanal işlevlere "saf sanal" denir. Saf bir sanal işlevin, genellikle olmasa da, bir gövdesi olabileceğini unutmayın. En az bir saf sanal işlevi olan bir sınıfa "soyut" denir ve somutlaştırılamaz, sadece türetilir.

Sanal işlevlerin sanal olarak adlandırılmasının nedenini, derleme zamanında hangi gerçek işlevin çağrılacağı bilinmediği gerçeğini tahmin ediyorum. Bir anlamda, sanal işlev çağrısı derleme zamanında "mevcut değil".

Ayrıca, "soyut" teriminin saf sanal işlevli bir sınıf için kullanılmasının nedeninin, bu sınıfın herhangi bir nesnesine sahip olamayacağınız olduğunu tahmin ediyorum. Bir anlamda, nesnelerin somut dünyasından uzak soyut bir kavramdır.

Düzenleme: Diğer diller.

"Sanal" teriminin ne kadar genel olduğu sorusuna gelince, işte iki sentim. Smalltalk'ta tüm işlevler dinamik bağlama kullanır, bu nedenle hepsi sanaldır ve özel bir terime veya bir dil anahtar sözcüğüne gerek yoktur. Java'da, yanılmıyorsam, derleyici otomatik olarak dinamik bağlamanın kullanılıp kullanılmayacağına karar verir, böylece programcı söz konusu olduğunda hiçbir ayrım yapılmaz ve dolayısıyla "sanal" anahtar kelime yoktur.

C ++ 'da sanal ve sanal olmayan arasındaki ayrım gereklidir, çünkü programlayıcıya ihtiyaç duyulmadığında yükten tasarruf etmek için dinamik bağlamanın ne zaman kullanılacağına karar vermek kalmıştır.


1
+1: Ayrıca, "Özet" birçok dilde geçerlidir. "Sanal" değil.
S.Lott

@ S.Lott: Tüm soru sanalın genel bir terim olup olmadığıdır. Şimdiye kadar anlayabildiğim kadarıyla, sanal birçok dile uygulanır ve önce Simula tarafından icat edildi. Saf / saf olmayan ve soyut hakkında soru kalır.
Steven Jeuris

@Steven Jeuris: "sanal birçok dilde geçerlidir"? Gerçekten mi. Şimdiye kadar, C, C ++ ve Simula gibi görünüyor. Kesinlikle biraz Python için geçerli değildir. Java için geçerli görünmüyor.
S.Lott

Object Pascal / Delphi için geçerlidir. Delphi'nin ek bir konsepti vardır dynamic- bu, zaman için yer ticareti yapan bir tür sanal yöntemdir: virtualyöntemlerden daha az yer kaplar ve yürütülmesi daha yavaştır .
Frank Shearar

2
@Steven Jeuris: "varsayılan olarak sanal", soyut işlevleri tanımlamak için "sanal" kullanmakla aynı şey değildir. "Tüm işlevler sanal" diyen millet başka bir dile C ++ kavramı uyguluyor düşünüyorum. Ve bence bunu yanlış yapıyorlar. Python'da tüm yöntem işlevleri sanal olduğundan, C ++ konseptini Python'a uygulamak için Stack Overflow gibi yerler dışında konu "sanal" kullanılarak asla belirtilmez. Sanırım bu durumlarda Python dil dokümanları kelimeyi kullanmadığı için sanal yanlış uygulanmış.
S.Lott
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.