Alan Kay, Küçük Tarihin Erken Tarihi'ndeki “ödev” ile ne demek istedi?


47

Smalltalk'ın Erken Tarihi'ni okuyordum ve anlamını anlamamı sorgulamama neden olan birkaç "ödev" belirtisi var:

OOP birçok motivasyondan gelmesine rağmen, ikisi merkezi idi. Büyük ölçek, ayrıntıların gizlenmesini içeren karmaşık sistemler için daha iyi bir modül şeması bulmaktı ve küçük ölçek ise daha esnek bir atama sürümü bulmak ve ardından onu tamamen ortadan kaldırmak içindi.

( 1960-66 arası - Erken OOP ve altmışlı yılların diğer biçimlendirici fikirleri , Bölüm I)

Simula’dan aldığım şey, şimdi bağları değiştirip hedeflerle atayabileceğin idi . Herhangi bir programcının yapmasını istediğiniz son şey, mecazi olarak sunulmuş olsa bile içsel durumla uğraşmaktır. Bunun yerine, nesneler dinamik bileşenler olarak kullanım için daha uygun olan üst düzey davranışların bulunduğu bir site olarak sunulmalıdır . (...) Bugün "nesne yönelimli programlama" olarak adlandırılan şeylerin çoğunun meraklı yapılarda basitçe eski tarz bir program olması talihsiz bir durumdur. Birçok program, şimdi daha pahalı ekli prosedürlerle yapılan "atama stili" işlemleriyle yüklenir.

( "Nesneye yönelik" Stil , Bölüm IV'ten)

Amacı, nesnelerin cepheler olması gerektiği ve amacı bir nesneye bir örnek değişkeni (yani bir "atama") koymak olan herhangi bir yöntem (veya "mesaj") olduğu gerçeğini yorumlamak doğru mudur? Bu yorumun IV. Bölümdeki sonraki iki ifadesiyle desteklendiği görülmektedir:

Birlikte kullanılan dört teknik - kalıcı durum, polimorfizm, somutlaştırma ve nesneye yönelik hedef olarak yöntemler - gücün çoğunu oluşturur. Bunların hiçbiri “nesne yönelimli bir dil” gerektirmiyor - ALGOL 68 neredeyse bu stile dönüştürülebilir - ve OOPL sadece tasarımcının fikrini belirli bir verimli yöne odaklıyor. Bununla birlikte, kapsülleme hakkını yapmak, yalnızca devletin soyutlamasının yanı sıra, devlet odaklı metaforların programlanmasını engelleme taahhüdüdür.

...ve:

Atama beyanları - soyut olanları bile - çok düşük seviyeli hedefleri ifade eder ve bunların yapılması için daha fazlasına ihtiyaç duyulur. Genel olarak, programcının simüle edilmiş olsun olmasın, devletle uğraşmasını istemiyoruz.

Opak, değişmez vakaların burada teşvik edildiğini söylemek doğru olur mu? Yoksa basitçe cesareti kırılmış olan doğrudan devlet değişimleri midir? Bir varsa Örneğin, BankAccountsınıf, 's Tamam olması GetBalance, Depositve Withdraw, örnek yöntemler / mesajları; sadece bir SetBalanceörnek yöntem / mesaj olmadığından emin olun ?

Yanıtlar:


86

Temel fikir (Sketchpad'den etkilenir) çoğu değişken / değerin dinamik-ilişki içinde olduğu - birbirleriyle (nesnenin iç tarafında tutulan) olduğu için, bir değeri doğrudan dışarıdan sıfırlayabilmek tehlikelidir. Zaten (Smalltalk'ta), gerekli olan en az bir belirleyici yöntem olduğundan, bu, istenen ilişkilerin sürdürülmesi için iç yöntem tarafından dışsal bir ayar hareketine aracılık edilmesini mümkün kılar. Ancak belirleyicileri kullanan çoğu kişi, iç değişkenlere doğrudan yapılanmaları simüle etmek için bunları basitçe kullanır ve bu, gerçek OOP'un ruhunu ve amacını ihlal eder.

Ancak nesnelerin zaman içindeki değişimlerin "dünya çizgileri" vardır. Bu, ilişkilerin uyumlu olduğu nesnenin tarihçelerinin versiyonları olarak düşünülebilir. Bu şemada herhangi bir yarış koşulu yoktur ... bir nesne ancak stabil olduğu ve bilgi işlem yapmadığı zaman görülebilir. Bu, HW'deki iki fazlı bir saat gibidir. (Strachey'den bir fikir ve McCarthy'den farklı ve Lucid'den etkilenmiş).

En iyi dileklerimle,

Alan Kay


2
@ alan-kay: Teşekkürler! Tezimde bunu alıntılama izniniz var mı?
Olivier Dagenais

2
Yan etki kontrolü ya da birçok dil için kutsal kâse olarak yan etki kontrolünü bilmek. Fakat henüz kimsenin bulamadığı anlaşılıyor. :)
matematik

@ OliverDagenais, Alan'ın çok mutlu olacağından emin olmasına rağmen (oldukça harika biri gibi görünüyor), SE cevapları CC lisanslıdır, bu yüzden SE soruları ve cevapları mükemmel bir şekilde açıklamaktadır.
Wayne Werner

İki fazlı saat? Bu, Excel'deki veya React.JS'deki gibi, nesnelerin kısıtlamaları korumak için herhangi bir değişikliği yaydığı "gözlemci" deseni ve veri akışı deseni gibi bir türdür.
aoeu256

21

Alan'ın bu soruyu zaten cevapladığını anlıyorum ve bu yüzden daha fazla cevap vermenin anlamsız gibi göründüğünü söyleyebilirim. Ancak, Alan sahip olduğunuz her soruyu cevaplamadı.

Özellikle:

Opak, değişmez vakaların burada teşvik edildiğini söylemek doğru olur mu? Yoksa basitçe cesareti kırılmış olan doğrudan devlet değişimleri midir? Örneğin, bir BankAccount sınıfım varsa, GetBalance, Deposit ve Withd örneği örneklerinin / iletilerinin olması sorun değil; sadece bir SetBalance örneği yöntemi / mesajı olmadığından emin olun?

Buradaki cevap, programınızı yapılandırmak için üst düzey davranış kullanmamanızdır. Gerçek dünyadaki finansal hizmetler sistemleri, bir BankAccount sınıfında Para Yatırma yöntemine sahip olmamalıdır, çünkü bankaların bilgisayar icadından önce nasıl çalıştığı kesinlikle bu değildir! ATM'ler icat edildiğinde, kelimenin tam anlamıyla bir Teller'in bankada yaptıklarını otomatikleştirmek zorunda kaldılar. Bir Teller’in rolü müşterileri hesaplarının durumu hakkında bilgilendirmek olacaktır. Bunu yapmak için, müşterinin Teller ile bir Para Çekme Fişi'ni Teller’e iletme gibi birkaç yolla etkileşimde bulunmasına izin verilir.

Bu nesnelerin doğrudan tahakkuk ettirilmesiyle - Teller, Deposit Slip, vs. - sorun alanı sistemdeki varlıklar tarafından iletilen mesajlara göre yapılandırılmıştır.

Bir Hesabın kendisi bir rol oynar - bir Hesap fikri, bir Varlık, Borç, Gelir veya Gider ile ilgili olarak finansal giriş ve çıkışların hesabı anlamına gelir. Bir Muhasebe sistemi veya Muhasebe, bu akışları kaydeder, saklar ve çoğaltır ve hesabın belirli bir zamanda finansal durumunu size bildirir. Teller tarafından yayınlanan en son rapor şu anda "şu an" olarak düşünülebilir, ancak gerçekten değil: Muhasebeci tarafından belli bir zamanda tarif edilen finansal durumdur. Sadece bankaya gittiğinizde "şu anda" olma yanılsaması var, çünkü genellikle ödeme yapmaya yetkili olan tek kişi sizsiniz. Bu, özellikle 100 yıl önce doğruydu, ancak bugün birçok insan otomatik ödeme aldı.

Bu neden önemli? Bir işlemi kaydetmek için ne yapılması gerektiğini kendinize sorun:

Müşterinin, Bankadan gelen makbuzlar dahil, yaptıkları her şeyin kendi iç denetim günlüğü vardır. Aynı şekilde, Banka yaptıkları her şeyin kendi iç denetim günlüğünü tutmaktadır. Banka hep yapar çift girişli muhasebe Onlar Genel Muhasebe ve Bilanço rekor işlemleri anlam. Bu, Bankanın uzlaşma gerçekleştirmesini sağlarve belirli bir mali süre boyunca kitaplarını kapattıklarında sahte giriş olmadığından emin olun (günlük, haftalık, aylık, üç aylık, yıllık, iki yılda bir, her neyse). Bu aynı zamanda, kaydedilmiş kayıtlar için kayıtsız olması gerektiğini de göstermektedir. Yani, tüm benzersiz işlemleri listelemek için bir program yazacak olsaydık, sahte kopyaları iç denetim günlüğümüzdeyken bile yapabilirdik, çünkü yanlış işlem tanımlayıcılarını günlük mesajlarına yerleştirdik.

Otomatik ödemelerin hesabınızı borçlandırması ve borçlandırması kabiliyeti göz önüne alındığında, Muhasebecinin sizin için de tahminde bulunabileceği anlaşılmaktadır . Bu, bilgisayarların muhasebe sistemleri üzerindeki etkisinin farkına vardı. Buna göre, birileri sadece geçmişe bakmakla kalmayıp aynı zamanda geleceğe bakmak ve nakit akışlarını tahmin etmekten daha ince bir ayrıntıya göre tahmin etmekle daha sınırlı olan Kaynaklar-Etkinlikler-Ajanlar adlı bir muhasebe sistemi tasarladı . Temel olarak, REA daha iyi raporlama ve iş analizi için klasik muhasebe sistemlerinden daha fazla meta veridir. Örneğin, "değer zinciri" analizi ve "tedarik zinciri" analizi klasik muhasebe ile yapılması kolay değildir.

Aynı şekilde, Agoric Computing veya Akıllı Sözleşmeler , piyasa mekanizmalarından bilgisayarlamaya kadar fikir getiriyor. Depozito Fişi verdiğinizde, para yatırmak için Çek veya Çanta da sağlamanız önemlidir. Çek'i almakla gerçekten Hesabınıza girmek arasında bir süre olduğundan, para birimini yönetmek için güvenli bir yol gerekir. Görünüşe göre, nesne yetenekleri dağıtılmış güvenli para birimini elde etmenin doğal bir yoludur. Alice'in Bob'u çek yazdıktan sonra bütün fonlarını çekerek aldatmamasını sağlamak için kullanılabilirler.


OOP'un çok yaygın BankAccountoyuncak örneğini dağıtdığınız için teşekkür ederiz .
akuhn

Genel olarak cevabınız mükemmel olsa da (çok az sayıda insan bir hesabın bakiye değil, işlemlerin bir listesi olduğunu anlar, bu nedenle bunun için teşekkür ederiz), çift girişli muhasebe hakkınız yoktur. İkili giriş noktası, bir hesaba yapılan her borç veya kredinin (yani işlemler listesi), eşleşecek şekilde diğer hesaplara karşılık gelen kredileri veya borçları olmasıdır. Örneğin, bir müşteriyi 108 ¥ tutarında borçlandıysanız (yani, müşteri size bu kadar para verdi), bu borçlandırmayı eşleştirmek ve paranın nereye gittiğini göstermek için 100 YTL tutarında bir gelir hesabını ve "vergi borcu" hesabını 8 ¥ tutarında kredilendirirsiniz. (veya gitmeli).
Curt J. Sampson
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.