Monkeypatching iyi bir programlama uygulaması mıdır?


15

Monkeypatching'in standart, iyi programlama pratiğinden ziyade hızlı ve kirli kesmek kategorisinde olduğu izlenimindeyim . Zaman zaman 3. taraf kütüphaneleriyle ilgili küçük sorunları düzeltmek için kullanılırken, geçici bir düzeltme olarak değerlendirdim ve 3. taraf projesine uygun yamayı gönderirdim.

Ancak, bu tekniğin genel projelerde, örneğin Gevent gevent.monkeymodülünde "normal yol" olarak kullanıldığını gördüm .

Monkeypatching ana akım, normal, kabul edilebilir programlama uygulaması haline geldi mi?

Ayrıca bakınız: Jeff Atwood tarafından "İnsanlar için Maymun Kapanışı"


13
O bir şey adlandırılmış söyleyebilirim maymun yama edilir DEĞİL iyi bir programlama uygulama olarak değerlendirilir. Ne olduğunu bile bilmeden, sadece ismiyle.
littleadv

3. taraf ihtiyacınız olan düzeltmeyi yapmak istemezse ne olur?

1
@ Thorbjørn: iyi soru, bir yandan maymunsu yemeyi sevmiyorum, diğer yandan projeyi klonlama ve sadece küçük bir sorunsa yerel yamaları tutma fikrinden hoşlanmıyorum.
vartec

1
@littleadv: ... sonra "hot fix" / "anında düzeltme" veya "runtime fix" olarak adlandırın ve kulağa hoş geliyor mu? ;) Hepsi aynı.
dagnelies

3
Javascript hemen hemen konsept etrafında inşa edilmiştir
ZJR

Yanıtlar:


19

Hayır, ama bazen maymun derisi daha az kötüdür (bozuk koddan daha :)). Yakuttaki maymun böcekleri için genel kurallarım:

  • maymun yaması için gerçekten iyi bir nedeniniz var (geçici kritik düzeltme iyi bir nedendir. ActiveSupport üzerinde çalışmadığınız sürece to_s yönteminin güzel biçimlendirmesi değildir)

  • bunları olabildiğince şeffaf hale getirin: kod tabanında ve ayrı dosyalarda belirli bir yere koyun, maymun oyununun nedenini açıklayan belgeler yazın (burada bir örnek ).

  • çıkarılması kolay - belgelerin çıkarılması ve nelere dikkat edilmesi gerektiği hakkında bilgi içermesi gerekir. Maymun parçaları bir sürü geçicidir, bu yüzden çıkarılması kolay olmalıdır.


11

Evet, maymun sıçraması çok faydalı!

Her nasılsa, isimler insanların algısı üzerinde oldukça etkili görünüyor. "Monkeypatch" deyin ve kulağa kötü geliyor, "hot fix" veya "on-fly-fix" deyin ve kulağa hoş geliyor.

Bundan bağımsız olarak, çalışma zamanında yöntemleri / nitelikleri / işlevleri değiştirme yeteneğinin çok yararlı olduğunu düşünüyorum. Javascript kullanıcıları bile bilmeden bütün gün kullanıyorlar.

Örneğin:

button.onclick = function(e) { ...}

Bu basit çizgi, düğmenin davranışını değiştirdiğinizi gösterir. Bu şekilde tasarlandı. Benzer şekilde, diğer tüm işlevleri de değiştirebilirsiniz, ancak bunu yapmak aptalca olur.

Şimdi, yamaları bu şekilde iletme sorusu için ... iyi ... neden olmasın. Büyük bir sürüm yerine küçük bir yama indirmeniz gerekiyor. Heck, bir sunucuyu durdurmadan bile yama yapabilirsiniz, harika! Ve bir gün, daha büyük bir güncelleme için en son sürümü de getirebilirsiniz. Yeterince adil. Evet, iyi bir şey olarak "çalışma zamanı yamaları" için oy kullanıyorum.

İlginç bir şekilde, Erlang gibi bazı diller bu kavramın etrafında inşa edildi. Sunucuyu anında güncelleme yeteneği.

Tabii ki, sonunda ve diğer her şeyde olduğu gibi, onu nasıl kullandığınızla ilgili bir mesele. Harika OO ve boktan şeyler yapabilirsiniz, hepsi aynı.

DÜZENLE:

İster kendi kütüphanenizi ister üçüncü taraf bir kütüphaneyi yamalayın, biraz vaka ayrımı ekleyeyim .

... temel olarak, böyle bir yama ile yaptığınız şey , kendi veya bir üçüncü taraf kütüphanesinin bir hatasını düzeltmektir . Her iki durumda da faydalıdır. Kendi başınıza, anında bir düzeltme sunmanıza olanak tanır. Üçüncü taraf bir kişi için, ya kendi başlarına çözene kadar beklerler (birkaç ay mı?), Ya da şimdi kendi başınıza yaparsınız. (yine de onlara yama gönderebilirsiniz, böylece kendi taraflarına sabitleyecekler). Sorun çözüldükten sonra bir sonraki lib sürümlerini serbest bıraktıklarında , kütüphaneyi güncellemek ve yanınızdaki yamayı kaldırmak istiyorsanız yine de yapabilirsiniz .

Şimdi, elbette, bir lib'in davranışını değiştirmek ve amacını / çalışma şeklini yabancılaştırmak için bir yama kullanırsanız, bu açıkça bir felaket tarifi. Bir maymun bile bunu görecekti ... umarım. ;)


1
Kimse bunun yararlı olmadığını söylemiyor. Ancak, genel olarak iyi bir uygulama değildir. Ve "düzeltme" ve "anında düzeltme" bana daha iyi gelmiyor.
Lukas Stejskal

1
Bir uygulamanın davranışını anında değiştirebilme yeteneğini çok faydalı buluyorum, büyükse bile daha kullanışlı. Heck, eski yöntemi yedek olarak depolayan kod bile olabilir ve talep üzerine otomatik olarak geri alma komutu! Olanaklar muazzam!
dagnelies

Bunun güçlü ve kullanışlı bir özellik olduğunu kabul ediyorum. Ama aynı zamanda çok tehlikeli (özellikle Ruby'de), bu nedenle çok dikkatli kullanılmalıdır (özellikle standart ve 3. taraf kütüphanelerin modifikasyonu için). Hiç birkaç maymunböceği 3. parti kütüphanesine bağlı olarak uygulamayı sürdürmeye çalıştınız mı? Bazı kütüphaneleri güncellemeye çalıştığınızda bir felaket tarifi.
Lukas Stejskal

1
Evet, katılıyorum, bu yamaları dikkatsizce, istenmeyen şekillerde veya kötüye kullanmanız durumunda, hızla dağınık hale gelebilir. Herhangi bir kavramı kötüye kullanabilir veya herhangi bir şeyle uğraşabilirsiniz. Ancak, aksi takdirde, iyi organize edilmiş ve şeffaflarsa ve hepsi bir sonraki büyük sürümde akarsa, bana temiz görünüyor. ... ancak, yoğun yamalı kütüphaneler konusunda deneyimim yok.
dagnelies

... ikinci davaya bazı yorumlar ekledim.
dagnelies

8

Tüm yamaların çalışma zamanı doğası ve tasarım zamanında yakalanamaması nedeniyle doğası gereği riskli olduğuna inanıyorum.

Çalışma zamanı istisnalarını kabul ederler ve sadece takip etmek için karmaşık hata ayıklayıcıları ve saatler gerektirirler.

İnsanlar SEAL derslerinde kullanılırlar ve bu nedenle miras imkansızdır. Ancak, nesnelere zarar vermeden genişletmenin daha iyi yolları vardır.

Benim görüşüm


4

Genel olarak yama yapmak son çare olmalı, maymun daha da yama yapmalı. Sorun öncelikle sürdürülebilirlik konusudur.

Uzun zaman önce, linux çekirdeğime, ekran kartı sürücüm ve sahip olduğum iki tescilli uygulama için gerekli olan 3 ayrı yama uygulandı. İkisinde çelişkili değişiklikler vardı, bu da aralarındaki farkları çözmek için 4. yamaya ihtiyacım olduğu anlamına geliyordu. Şimdi, yukarı akış çekirdeğinde bir güvenlik sorunu giderildiğinde, ya bu 3 düzeltme ekinin satıcılarının bir ila altı ay süren yeni çekirdek sürümüne yönelik bir güncelleştirme yayınlamasını beklemek zorunda kaldım, ya da yukarı akışını el ile sürdürmek zorunda kaldım güvenlik düzeltme ekleri diğer yama satıcıları yakalayana kadar.

Birkaç yıl sonra, satıcılar yukarı akış çekirdeği kaynağına dahil olmayı başardı ve ben dengeleme hareketini durdurabildim, ancak bu arada ne kadar karışıklık olduğunu görebilirsiniz. Gerekmedikçe bunu programcılarınıza zorlamayın.


3

Hayır. Yazılım geliştirme için standart bir teknik değildir. Akut bir sorunu çözmek için geçici bir çözüm olmaya devam ediyor ve net dezavantajları var. Liskov İkame İlkesinin ihlali akla geliyor. Maymun yama, programlar hakkında mantık yürütmeyi ciddi şekilde zorlaştırır. Kendi programlarınız için kodu ait olduğu yere koymalısınız. Üçüncü taraf kütüphaneleri için her zaman tehlikede yaşayacaksınız, yamanız lib'in bir sonraki sürümünde çalışmayacak.

Elbette maymun yama, ne yaptığınızı biliyorsanız ve bir SOLID çözümü uygulamak için zamanınız yoksa faydalıdır . Ama bunu asla standart bir teknik olarak düşünmemeli ve maymun yaması üzerine maymun yaması yapmamalısınız .

BTW, hiç maymun yaması için birim testi yazdınız mı?


Burada LSP uygulayabileceğinizi sanmıyorum. Alt tiplerle ilgili çok spesifik bir tanımı vardır.
Konrad Rudolph

@KonradRudolph Maymun bir nesneyi yamalamak türünü değiştirir. Dinamik olarak yazılan dillerde, u tipi ile aynı arayüze sahip her t tipi u'nun bir alt tipidir. Ördek gibi
yürürse

“… Türünü değiştirir” - yeterince adil. Mantıklı.
Konrad Rudolph

RE "Yazılım geliştirme için standart bir teknik değil.", Test için Python'da her zaman ve büyük kütüphanelerde "yapılmış gibi görünüyor.
Tommy
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.