OOP uzmanları için soru. - sayfa 52

 

Programlarda açıklanan nesne sistemlerinde OOP ve Kernel'in bir melezi olan yeni prizmama baktım - beynim neredeyse patlayacaktı. Her şeyden önce, GUI'min sistemlerine yeni bir göz attım. Tüm bu parametre nesneleri, durum nesneleri, olay nesneleri ve işleyici nesneleri aracılığıyla. GUI ve teknolojisi benim için bilindiğinden, her şey kendini oldukça net bir şekilde sundu, ancak sistemin çok karmaşık olduğu ortaya çıktı. Çok sayıda parametre, bağlama ve işleyici. Bu tür sistemlerin kendi kendine oluşamayacağı sonucuna vardım. Ve doğal seleksiyon burada güçsüzdür.)))

Bu yüzden:

Her parametre, n'inci sayıda türetilmiş parametreye sahip olabilir. Diyelim ki: X'teki bir değişiklik, zamanın her anında bu X'in değerlerinden sonsuz sayıda parametre türevine yol açabilir.

Her türetilmiş parametrenin bir işleyicisi ve diğer parametrelere bir bağlantısı olmalıdır. Hiçbir parametre kendi başına mevcut değildir. İletişim gereklidir.

Bağlantı farklı olabilir ve bu nedenle çok çeşitli filtre işlemcileri, düzelticiler ve dönüştürücüler görünebilir.

Sistemler için önemli sayılabilecek sonsuz sayıda olay vardır. Her birinin kendi özellikleri, bağlantıları ve işleyicileri vardır. Seçenekler sayısız.

Dolayısıyla bir kavram olmadan hiçbir sistem var olamaz. (Büyük olasılıkla).

Dünya'da yaşamın nasıl ortaya çıktığı belli değil...

 

Başka bir örnek vereyim:

Bir tabloya göre kontrolleri olan bir pencereyi hareket ettirmek için bir sistem düşünelim.

  • "İmleç" nesnesinden iki parametre alıyoruz - x, y. Onlardan, x ve y'nin mevcut ve geçmiş değerleri arasındaki farkı depolayacak iki türetilmiş parametre nesnesi oluşturuyoruz. (Parametre nesneleri yalnızca değişkenler değildir, kendi özelliklerine sahip nesnelerdir).
  • (1) x ve y değerlerini işleyecek parametre nesneleri için bir işleyici nesnesi oluşturuyoruz, işleyici özelliklerinde yazılan pencere tutamacı olayında mevcut ve geçmiş değerler arasındaki farklarını alıyor, (2 ) türetilmiş parametrelere farkı birim aynı olay üzerine yazın.
  • Nesnelerden türetilen parametreler ile her pencere nesnesinin x, y nesne parametreleri arasında, değerlerin kendilerine aktarılacağı bir Nesne bağlantısı oluştururuz.
  • Binding Object'ten sonra, her pencere nesnesinin x ve y nesne parametresinden bir değer alması ve buna paketten geçen değeri eklemesi gereken başka bir İşleyici Nesnesi yaratırız.

Böylece bu sistem sayesinde, imleç ile tutamağını kavrama durumunda pencerenin ve nesnelerinin koordinatlarını değiştirebiliyoruz. Taşımak için, tüm bunları, MT nesnesinin grafikteki konumunu değiştiren ObjectSetInteger işleyici işlevleriyle ilişkilendirmeniz gerekir.

Bu, özel blok sistemlerini bağlayarak yalnızca bir GUI işlevinin uygulanmasıdır - Parametre Nesneleri, İşleyici Nesneleri, vb...

Çekirdekte böyle bir sistem oluşturmak, her şeyi bir Nesneye dönüştürmeden sıradan kod yazmaktan neredeyse kolay (ve belki de daha zor) değildir. Ama kazmaya devam edeceğim...


not. Pencereyi hareket ettirmek için eklemeyi unuttum, ayrıca pencere tutamağına basıp imleci hareket ettiren bir olay nesnesi "yapmanız" gerekiyor. Ve bu Olay-Nesnesini, imlecin x,y değerlerinin (türetilmiş parametrelere farkı yazan) Nesne-işleyicisine bir bağlantı ile bağlayın, böylece sadece bu olayın sinyali üzerinde çalışacaktır.

ZYY. Ve her Olay Nesnesi için kendi işleyici Nesnenizi oluşturmanız ve ona bağlamanız gerekir.

ZYYY. Ve her işleyici nesnesinin, parametreler veya olaylarla çalışırken değerlerini kullandığı kendi özellikleri vardır. Bu nedenle, bir şablon olmalı, aksi takdirde tüm bunları oluşturmaktan "yorulabilirsiniz".))

 
Реter Konow :

Başka bir örnek vereyim:

Bir tabloya göre kontrolleri olan bir pencereyi hareket ettirmek için bir sistem düşünelim.

  • "İmleç" nesnesinden iki parametre alıyoruz - x, y. Onlardan, x ve y'nin mevcut ve geçmiş değerleri arasındaki farkı depolayacak iki türetilmiş parametre nesnesi oluşturuyoruz. (Parametre nesneleri yalnızca değişkenler değildir, kendi özelliklerine sahip nesnelerdir).
  • (1) x ve y değerlerini işleyecek parametre nesneleri için bir işleyici nesnesi oluşturuyoruz, işleyici özelliklerinde yazılan pencere tutamacı olayında mevcut ve geçmiş değerler arasındaki farklarını alıyor, (2 ) türetilmiş parametrelere farkı birim aynı olay üzerine yazın.
  • Nesnelerden türetilen parametreler ile her pencere nesnesinin x, y nesne parametreleri arasında, değerlerin kendilerine aktarılacağı bir Nesne bağlantısı oluştururuz.
  • Binding Object'ten sonra, her pencere nesnesinin x ve y nesne parametresinden bir değer alması ve buna paketten geçen değeri eklemesi gereken başka bir İşleyici Nesnesi yaratırız.

Böylece bu sistem sayesinde, imleç ile tutamağını kavrama durumunda pencerenin ve nesnelerinin koordinatlarını değiştirebiliyoruz. Taşımak için, tüm bunları, MT nesnesinin grafikteki konumunu değiştiren ObjectSetInteger işleyici işlevleriyle ilişkilendirmeniz gerekir.

Bu, özel blok sistemlerini bağlayarak yalnızca bir GUI işlevinin uygulanmasıdır - Parametre Nesneleri, İşleyici Nesneleri, vb...

Çekirdekte böyle bir sistem oluşturmak, her şeyi bir Nesneye dönüştürmeden sıradan kod yazmaktan neredeyse kolay (ve belki de daha zor) değildir. Ama kazmaya devam edeceğim...


not. Pencereyi hareket ettirmek için eklemeyi unuttum, ayrıca pencere tutamağına basıp imleci hareket ettiren bir olay nesnesi "yapmanız" gerekiyor. Ve bu Olay-Nesnesini, imlecin x,y değerlerinin (türetilmiş parametrelere farkı yazan) Nesne-işleyicisine bir bağlantı ile bağlayın, böylece sadece bu olayın sinyali üzerinde çalışacaktır.

ZYY. Ve her Olay Nesnesi için kendi işleyici Nesnenizi oluşturmanız ve ona bağlamanız gerekir.

ZYYY. Ve her işleyici nesnesinin, parametreler veya olaylarla çalışırken değerlerini kullandığı kendi özellikleri vardır. Bu nedenle, bir şablon olmalı, aksi takdirde tüm bunları oluşturmaktan "yorulabilirsiniz".))

Karmaşık. Bu mantıksız bir şekilde zor.
Bu formun geri kalanının içinde bulunduğu formun ana nesnesi - sadece koordinatları alır. Herhangi bir koordinatın değiştirilmesi, ana şekil nesnesinin konumunu değiştirir. Bu formun geri kalan nesnelerine, form içindeki konumlarını belirleyen göreceli koordinatlar verilir. Tüm nesnelerin formda kendi sırası vardır ve bu sırayla yeniden oluşturulur. Her nesnenin kendi içinde içerdiği şeylerin bir listesi vardır. İçeriğe liste aracılığıyla erişmek, her içeriğe bir shift komutu göndermenize olanak tanır. Böylece, form nesnesine hareket komutu verilerek, formun tüm içeriğine hareket komutları zincir boyunca otomatik olarak iletilir. Yani, ofset yalnızca form için yapılır ve diğer her şey otomatik olarak dengelenir. Her şekil nesnesine hareket etmesi için manuel olarak bir komut vermemiz gerekmeyecek.
Her şeyi tek bir nesne için yapıyoruz. Diğer herkes tekrar edecek. Bir form nesnesi ne kadar karmaşık olursa olsun, bir formu taşımak için tek bir komut, o formun tüm içeriğine taşar.
Her şeyi sadece bir kez yaparız. Ve sonra - her şey bir zincir halinde yapılacak.
 
Artyom Trishkin :
Karmaşık. Bu mantıksız bir şekilde zor.
Bu formun geri kalanının içinde bulunduğu formun ana nesnesi - sadece koordinatları alır. Herhangi bir koordinatın değiştirilmesi, ana form nesnesinin konumunu değiştirir. Bu formun geri kalan nesnelerine, form içindeki konumlarını belirleyen göreceli koordinatlar verilir. Tüm nesnelerin formda kendi sırası vardır ve bu sırayla yeniden oluşturulur. Her nesnenin kendi içinde içerdiği şeylerin bir listesi vardır. İçeriğe liste aracılığıyla erişmek, her içeriğe bir shift komutu göndermenize olanak tanır. Böylece, form nesnesine hareket komutu verilerek, formun tüm içeriğine hareket komutları zincir boyunca otomatik olarak iletilir. Yani, ofseti sadece form için yapıyoruz ve diğer her şey otomatik olarak offset olacak. Her form nesnesine kendimiz bir shift komutu vermemiz gerekmeyecek.
Her şeyi tek bir nesne için yapıyoruz. Diğer herkes tekrar edecek. Bir form nesnesi ne kadar karmaşık olursa olsun, bir formu taşımak için tek bir komut, o formun tüm içeriğine taşar.
Her şeyi sadece bir kez yaparız. Ve sonra - her şey bir zincir halinde yapılacak.

Pekala.

İmlecin x,y farkını içeren türetilmiş parametreler ile (zincirlenmiş) form nesneleri arasındaki bağlantı, merkezde her form nesnesinin x,y parametrelerine seri olarak bağlanabilen bir işleyiciye sahiptir. Diğer bir deyişle, bir seri bağlantı işleyicisi aracılığıyla parametreleri bağlama, her form nesnesinin bağlamasını x,y fark değerlerini geçen türetilmiş parametrelerle değiştirmenize olanak tanır. Ben de bunu düşündüm.

GUI'mde, bir pencereyi taşımak, aşağıdakileri yapan bir işlevin içinde uygulanır:

(1) Pencere tutamağında tıklama olayını kontrol etme

(2) İmleç hareket olayı

(3) Mevcut ve geçmiş imleç koordinatları arasındaki farkı hesaplama

(4) Pencere nesneleri arasında bir döngü yapmak ve imleç konumundaki farkı düzelterek koordinatlarını değiştirmek.

(5) Pencere şeklinin (tuval) MT-nesnesini çizelge boyunca belirtilen mesafe kadar hareket ettirmek için ObjectSetInteger'ı çağırmak .


Yani fonksiyon içindeki uygulama doğrudur. İşleyici Nesneleri, Parametre Nesneleri ve Bağlantı Nesneleri aracılığıyla uygulama bu arka plana karşı garip görünüyor. Ama kazalım...

 
Реter Konow :

Pekala.

İmlecin x,y farkını içeren türetilmiş parametreler ile (zincirlenmiş) form nesneleri arasındaki bağlantı, merkezde her form nesnesinin x,y parametrelerine seri olarak bağlanabilen bir işleyiciye sahiptir. Diğer bir deyişle, bir seri bağlantı işleyicisi aracılığıyla parametreleri bağlama, her form nesnesinin bağlamasını x,y fark değerlerini geçen türetilmiş parametrelerle değiştirmenize olanak tanır. Ben de bunu düşündüm.

GUI'mde, bir pencereyi taşımak, aşağıdakileri yapan bir işlevin içinde uygulanır:

(1) Pencere tutamağında tıklama olayını kontrol etme

(2) İmleç hareket olayı

(3) Mevcut ve geçmiş imleç koordinatları arasındaki farkı hesaplama

(4) Pencere nesneleri arasında bir döngü yapmak ve imleç konumundaki farkı düzelterek koordinatlarını değiştirmek.

(5) Pencere şeklinin (tuval) MT-nesnesini çizelge boyunca belirtilen mesafe kadar hareket ettirmek için ObjectSetInteger'ı çağırmak .


Yani fonksiyon içindeki uygulama doğrudur. İşleyici Nesneleri, Parametre Nesneleri ve Bağlantı Nesneleri aracılığıyla uygulama bu arka plana karşı garip görünüyor . Ama kazalım...

Evet, çünkü bu işleyicileri nesneden ayrı olarak yapmanız gerekmez. İmleç koordinatlarını döndüren sınıf statik hale getirilebilir - programın herhangi bir sınıfı tarafından kullanılabilir ve koordinatları alma ve bunlara tepki verme her nesnede uygulanmalıdır. Ancak bu işleyicilere yapılan çağrı yalnızca formun ana nesnesi üzerinde olmalıdır. Ardından, formun diğer tüm nesneleri için yeni koordinatlar belirlemek ve yeniden çizmek yeterlidir. Form nesnesinin içinde tüm nesnelerinin bir listesi bulunur. Form nesnesi koordinatlarında bir değişiklik tespit etti - koordinatları için yeni değerler ayarlar, nesnelerinin listesini gözden geçirir ve listesindeki her nesnenin koordinatlarını ayarlama yöntemlerini çağırır. Aynı zamanda, sonraki her nesne, koordinatlarını değiştirirken aynı şeyi yapar - nesnelerinin listesine bakar ve onlara koordinatları değiştirme komutu verir. Listelerde nesneler çizildikleri sıraya göre (Z-dizisi) düzenlenir. Yani, her nesnenin kendi koordinat değiştirme yöntemi vardır, ancak aynı şekilde uygulanır - tüm "kendi" nesnelerinin listesine bakar ve her biri için aynı yöntemi çağırır. Böylece, ana form nesnesi üzerinde bu yöntemi bir kez çağırarak, kesinlikle tüm form nesneleri için koordinat değişikliğini otomatik olarak başlatacağız. Form nesnesinin "kendi" nesnelerinin tüm listesini işledikten sonra, grafiği yeniden çizme yöntemi çağrılır - değiştirilen tüm nesneler için bir kez.

 
Artyom Trishkin :

...

Bu, pencere hareket mekanizmasının standart OOP görünümüdür. Sana bir tane daha göstereceğim. Bunu yapmak için bir anlığına zihninizi boşaltın ve sadece düşüncemi takip edin.

  1. Bir dizi matrisi düşünün. Boyutlar tanımlı değil. Belki sonsuz, belki değil. Önemli değil.
  2. Matris sıfırlarla başlatılır. Sıfırlar boşluğu temsil eder. Yani matris boştur.
  3. Matrisin boşluğunda boşluktan başka bir şey belirdi. Bu sıfır, belirli bir değerle değiştirilmiştir. Hangisi olduğu önemli değil.
  4. Bu değeri boş bir matriste görüyoruz ve "bu bir parametredir" diyoruz. Yani, değerin kendisi değil, göründüğü hücre. Hücreye başlık verildi ve bir parametre, yani bir değer içeren bir "kapasite" olarak adlandırıldı.
  5. Parametre hemen tanımlamamızı gerektiriyor. "Ben bir parametreyim ve bir bireyselliğim var! Benim malım nerede?!" der gibi. Ve parametreye kendi değerlerine sahip parametreler olan özelliklerini eklemekten başka seçeneğimiz yok. Onları yanına koyarız ve bir zincir elde ederiz - bir parametre ve özellikleri. "Bir Parametre Nesnesi oluşturduk!" diyoruz.
  6. Ayrıca, parametre "diyor": "Diğer parametreler nerede?! Neden yalnızım?" Ve sonra matrisin boşluğunda birkaç parametre daha yaratırız, böylece "ilk doğan" sıkılmaz. Tabii ki, yeni parametrelerin her biri kendi bireyselliğini beyan eder ve taşıyıcıları olarak özellikler gerektirir. Bu, aralarında "ilk doğan" ve özelliklerinin olduğu parametre zincirlerinin nasıl büyüdüğüdür. "Parametre Nesneleri oluşturduk!" diyoruz.
  7. Şimdi, matrisin boşluğunda, özelliklerinin zincirleriyle birlikte birkaç parametremiz var. Ama her biri varlıklarının anlamsızlığı hakkında "çığlık atıyor". Her biri yalnızdır. Ardından, parametreleri "sıkılmasın" diye bağlamaya karar veriyoruz. Bunu yapmak için, diğer parametreler arasında bağlantı görevi gören özel parametreler oluşturuyoruz. Ayrıca özellik zincirlerinden oluşurlar. Şimdi, ilk doğan parametreler, demetlerin parametreleriyle birbirine bağlıdır. Herkes mutlu! "Parametre Bağlama Nesneleri oluşturduk!" diyoruz.
  8. Ancak burada, ilk doğan parametrelerin paketler aracılığıyla birbirleriyle iletişim kurmak ve değerleri iletmek istediği ortaya çıktı, ancak paketler değerlerin transferini (parametre dili) sağlar, ancak çeviri sağlamaz. Ve parametreler yalnız oldukları için sadece kendi dillerini anlarlar, yani parametreler arasında bir "dil engeli" oluşur ve bizden bir karar isterler.
  9. "Parametrelerin iletişimi" sorununu çözmek için birkaç bağlantımız vardı, bir çeviriye ihtiyacımız vardı. Bu, parametreler arasında geçirilen değerlerin, her bir parametrenin özellikleri dikkate alınarak dönüştürülmesi gerektiği anlamına gelir. Bazıları 1-10, bazıları (-5) - (-105) aralığındaki değerleri anlar. Birisi kesirli sayılarla ve biri - derecelerle çalışır. Ardından, "çevirmenlere" - yani parametrelerin özelliklerini dikkate alan değer işlemcilerine - ihtiyaç duyulduğu sonucuna varıyoruz. Özel İşleyici Nesneleri oluşturuyoruz ve bunları parametreler arasındaki bağlamalara ekliyoruz. Değer işleyici nesneleri, geçen ve alan parametrelerin özelliklerini ve kendi özelliklerini kullanarak parametreler arasında geçirilen değerleri "çevirir". "İşleyici Nesneleri yarattık! Artık parametreler özgürce haberleşebilir!" diyoruz.
  10. İlk doğan parametreler konuştu, konuştu ve onlardan bıktı. Yorgun. Sonra sadece özel durumlarda iletişim kurmaya karar verdiler - yani, içlerinden birinin inanılmaz bir anlamı olduğunda. Ancak, bir çocuk gibi, yorulmadan anlamı takip etmeniz gerektiği ortaya çıktı. Ardından, ilk doğan parametreler, olağandışı "hileler" durumlarını işaret edecek bir tür "kontrol sistemi" bulmamızı istedi, böylece bu konuda endişelenmeyeceklerdi. Ardından yanıtlamanız gereken değerlerden bir kadro oluşturduk ve özel olarak koyduk. işleyici ve "Nesne-olay" aldık. İlk doğan her parametreye bağladık ve Olay Nesnelerinin sinyallerini kullanarak iletişim kurmaya başladılar. Ve böylece "Event Object"i yarattık.

Bu hikayenin sonu...

Matrix'e yandan baktık ve nefesimiz kesildi! "Evet, Nesne sistemini yarattık!"))

not. Her şeyin bir matris dizisinde oluşturulabileceğini unutmayın. Ve dizi matrisi Çekirdektir. Ve içindeki varlıklar gerçek nesnelerdir. Ve parametreler, olaylar ve paketler, özellikler ve işleyiciler. Çekirdekte bu temel şeylerden oluşturulabilecek sayısız sistem var.

 

Komik devam filmi...

11. Modanın ilk doğan parametrelerini nasıl takip edeceğine karar verdi. Matrisin bir yerinde bir emlak fuarı olduğunu ve yenilikte belirli bir alan olduğunu öğrendik. Mesela üç özelliği var. "Ölçüler" denir. Bu özellikler için değer seçiminin sözde sonsuz olduğu ve bonus olarak "parametre-zamanı" da bonus olarak veriyorlar. Parametreler fuara geldi ve x, y, x_size, y_size özelliklerini aldı. Uzayda kendimize bir kabuk yapmak istediğimizi söylüyorlar. Eh, başka bir renk (renk) yakaladılar. Döndüler ve yeni mülklerde giyinmeye başladılar. Yorulana kadar kendilerine uzamsal kabuklar kalıba döktüler. Acayip büyümüşler, sonra çökmüşler... Sonra renkleri giyip sakinleşmişler. Bundan sonra ne yapacaklarını düşünmeye başladılar... Ve sonra, özellikler-zaman kutusuna baktılar. Düşünsünler, nasıl bir şey deneyelim... Açmışlar, kendilerine göre ayarlamışlar ama değerleri hesaplamamışlar ve bir anda buharlaşıp boşluğa düşmüşler. Sonuçta, zaman çok dikkatli olmanız gereken bir parametredir ...

 
Реter Konow :

Komik devam filmi...

11. Modanın ilk doğan parametrelerini nasıl takip edeceğine karar verdi. Matrisin bir yerinde bir emlak fuarı olduğunu ve yenilikte belirli bir alan olduğunu öğrendik. Mesela üç özelliği var. "Ölçüler" denir. Bu özellikler için değer seçiminin sözde sonsuz olduğu ve bonus olarak "parametre-zamanı" da bonus olarak veriyorlar. Parametreler fuara geldi ve x, y, x_size, y_size özelliklerini aldı. Uzayda kendimize bir kabuk yapmak istediğimizi söylüyorlar. Eh, başka bir renk (renk) yakaladılar. Döndüler ve yeni mülklerde giyinmeye başladılar. Yorulana kadar kendilerine uzamsal kabuklar kalıba döktüler. Acayip büyümüşler, sonra çökmüşler... Sonra renkleri giyip sakinleşmişler. Bundan sonra ne yapacaklarını düşünmeye başladılar... Ve sonra, özellikler-zaman kutusuna baktılar. Düşünsünler, nasıl bir şey deneyelim... Açmışlar, kendilerine göre ayarlamışlar ama değerleri hesaplamamışlar ve bir anda buharlaşıp boşluğa düşmüşler. Sonuçta, zaman çok dikkatli olmanız gereken bir parametredir ...

Ve ilk on ciddi miydi?

Mesela ben gülmeden okuyamıyorum.

 
Artyom Trishkin :

...

Bütün bu "nesnellik" beyinleri çok karıştırıyor, hemfikir olmalısınız... Buna dikkat etmelisiniz. Nikolai Semko, deha ve şizofreninin yakınlığından bahsederken haklıydı. Gidebilirsin". Anlaşılmaması daha iyi olan şeyler var. Bazı kapılar her zaman Bilincimize kapalı olmalıdır. Bir filmde dedikleri gibi, - "En tehlikeli parazit bir fikirdir. Bir kez beyne bir kez girdi mi, onu ayırt etmek zaten imkansızdır." Bahsettiğim matris Zihin için tehlikelidir. İçinde kaybolmak ve sonsuza kadar kaybolmak kolaydır. Dikkatli olalım.)))

 
Sistemlerin Matrix'te temsili, yapılarına yeni bir bakış atmamızı sağlar, ancak sistemlerin oluşturulmasını kolaylaştıran herhangi bir ipucu görmedim. Bir çeşit "kendini geliştirme"den bahsetmiyorum bile. Sistemleri bu şekilde düşünmek çok ilginç, ama artık değil. Herhangi bir kişisel gelişim görmüyorum, bunun bir ipucu bile yok. Bu nedenle, İlahi olanı Tanrı'ya bırakalım. Ne standart OOP yaklaşımı ne de benimki herhangi bir kendi kendine sistem geliştirmeyi başaramaz.
Neden: