Başka dillerden kavramları taklit etmekten ne gibi sorunlar çıkabilir?


12

Web üzerinde birçok kez okudum, eğer diliniz nesne yönelimi veya belki fonksiyon çağrıları gibi bazı kavramları desteklemiyorsa ve bu diğer bağlamda iyi bir uygulama olarak kabul edilir.

Şu anda görebildiğim tek sorun, diğer programcıların kodunuzu normalden çok farklı bulabilmeleri ve programlarını zorlaştırmalarıdır. Bundan başka hangi sorunların ortaya çıkabileceğini düşünüyorsunuz?


3
İnsanlar bir şey için seninle dalga geçecek :-)
Karl Bielefeldt

Bir kez D'den bir iç içe işlev ayrıştırıcısını java'ya çevirdim ama şimdiye kadar yazdığım en temiz kod parçası olmadığını itiraf edeceğim (bir arabirime sahip büyük bir işlev ve içinde tanımlanan birkaç sınıf)
cırcır ucube

Yanıtlar:


23

Sorunlardan biri, kullandığınız dilde daha basit bir yol varken, bir şeyi başka bir dilde yapacağınız şekilde ifade etmek için çok sayıda kod yazarken bulabilmenizdir.

Örneğin, Yığın Taşması ile ilgili bir cevapta, .NET Framework'te kullanılan kod sözleşmelerinin, bunları desteklemeyen PHP'de nasıl kısmen benzetilebileceğini açıkladım. Aynı şey basit dizilerle yapılabildiğinden, hiçbir şey için çok fazla kod yazdım.

Daha genel olarak, her dilin kendi kültürü, kendi en iyi uygulamaları, kendi tarzı vardır.

  • C # kodunu C gibi yazmaya başlarsam çirkin olur.

  • Haskell'i, Haskell'i kullanmak zorunda kalan ancak güçlü yönlerini anlamak istemeyen ve sadece Java kavramlarını klonlamak isteyen bir Java geliştiricisi olarak görürsem, yazacağım kod zarar görecektir.

  • vb.

Dili geliştirmeye çalışırken yanlış bir şey yoktur (örneğin , F # gibi ölçü birimlerini tanıtarak C # 'ı geliştirin ), ancak çok fazla yapıyorsanız, belki de gerçekte ihtiyaçlarınıza uyan farklı bir dil seçmelisiniz.


+1 İyi yanıt ve C # 'a F # gibi ölçü birimleri ekleyerek ek arama terimleri için teşekkür ederiz.

2
Bir keresinde Java'yı kullanmaya zorlandığı için işinden ayrılan biri olarak, 2 sentim: Haskell'i kullanmaya zorlanamıyorum, biri ona aşık oluyor ve sonra geri dönüşü olmayan bir noktaya çekiyor. Haskell sadece içine düşmek istediğiniz güzel bir kara delik gibidir - ve gerçek olandan farklı olarak, hala hikayeyi anlatmak için yaşarsınız :)
Cetin Sert

belki başka bir dil seçmelisiniz ... istemci tarafı JavaScript gibi bir seçeneğiniz olmadığı sürece. (Öyle olsa bile, seçeneğin olmaması, sınıf tabanlı OOP öykünmesini prototip bir dilde uygulamak için bir mazeret değildir. Sadece dilin nasıl çalıştığını öğrenmek için çok daha etkilidir.)
kojiro

@kojiro: veya başka bir iş. PHP'yi kullanmak zorunda kaldığımda da aynı sorunu yaşadım ve sürekli olarak kendi derleyicimi yazmak da dahil olmak üzere dili değiştirmeye çalışıyordum. Daha az çılgın bir çözüm işimi değiştirmek ve sadece PHP kullanmayan projelerde çalışmaya başlamaktı.
Arseni Mourzenko

1
@Cetin Sert: katılıyorum, Haskell mükemmel bir dildir. Ama eğer birisi onu öğrenmek istemiyorsa ve fonksiyonel programlamayı anlamıyorsa, Haskell'i takdir etmek zor olurdu.
Arseni Mourzenko

10

Okunabilirlikteki düşüş kendi başına bir problemdir: projenizi potansiyel olarak sizden kapsamlı bir eğitim almadan sürdürebilecek insan havuzunu önemli ölçüde azaltır.

Ek olarak,

  • Yabancı paradigmanın uygulanması, kullanımından kaynaklanan potansiyel tasarruflardan daha pahalıya mal olabilir
  • Yabancı işlevselliğe adaptasyonunuz buggy olabilir, bu da bakım maliyetlerini artırır
  • Yabancı işlevselliği uyarlamanız, teknoloji yığınınızı yerel uygulamanızın gerektirdiği sınırların ötesine itebilir.

2
Bir keresinde vanilya C'de C ++ dinamik dağıtımını (sanal tablolar, vb.) Taklit etmek zorunda kaldım ve tam olarak bu problemle karşılaştım: Dinamik dağıtımı anlamayan C programcıları projeye katkıda bulunamadılar veya sürdüremediler.
comingstorm

4

Kağıt üzerinde göründüğü kadar iyi bir fikir değil.

Örnek 1: Yeterince yaşlıysanız, C'nin kasabadaki yeni çocuk olduğu günleri hatırlayabilirsiniz. Pascal ve Ada programcıları C'nin açık ve kapalı parantezlerini beğenmediler. Onlar # tanımlı beginve endayracı açmak ve ayracı kapatmak için, ve voila! Cada! Talihsiz sonuç Ada ya da C açısından çirkindi.

Örnek 2, kişisel: Ortak Lisp Nesne Sistemi hakkında gerçekten sevdiğim şeylerden biri, önceki, sonraki ve etrafındaki yöntemler. Birden fazla yerde çok kullanışlı olabilirler. Bu yüzden birkaç farklı yerde C ++ 'da bu konsepti taklit ettim. Bu yapıları C ++ ile taklit etmenin tek yolu, türetilmiş bir sınıf geliştiricisinin kodda doğru yerde üst sınıfın aynı adı taşıyan yöntemi çağırmasını istemektir. Bu, C ++ programlamaya biraz yabancı olan ve belki de C ++ programlamasına karşı olan sınıflarımdan türeyen geliştiriciler için bir gereksinim ortaya koydu. Bu gereklilik ne kadar iyi belgelenmiş olursa olsun, insanlar C ++ paradigmasına tam olarak uymadığı için yönergeleri izlemedi.


2

Başka dillerden kavramları taklit etmekten ne gibi sorunlar çıkabilir?

Sızdıran soyutlamalar.


Cevabınıza daha fazla ayrıntı eklemek güzel olabilir. Makale, bir soyutlamanın önemli bir performans optimizasyonunu yakalayamadığı bir durumla ilgilidir, ancak daha büyük problemlerin tutarsız köşe davası davranışı ve tutarsız garantilerden kaynaklandığını söyleyebilirim; ikincisinin bir örneği, C # 'ın outparametreleri gerçekten desteklemeyen bir çerçevede taklit etme girişimidir ; C #, her işlevin her zaman tüm outparametrelerine yazacağını varsayar , ancak C # yöntemleri tarafından çağrılan C # olmayan yöntemler böyle bir garanti vermez.
supercat

1

Bu yasaklamak zor olabilir. Java uygulamanıza C # dan LINQ uygulamaya çalıştığınızı düşünün. Ya da sadece bir dile sözcüksel kapanışlar eklemeye ne dersiniz? Size hemen hemen yeni bir dil veren yeni bir derleyici yazmak zorunda kalacaksınız.

Veya kendi dilinizi uygulamak zorunda olmadığınız durumlarda, kod blokları veya lambda işlevleri veya kapanışları veya işlevleri olmayan bir dilde daha üst düzey işlevleri (harita gibi) kullanarak toplama yöntemlerini uygulamayı denediğinizi düşünün. sınıf nesneleri. Her yüksek emir işlevi bir arabirim olarak bildirilmeli ve açıkça uygulanmalıdır ve bir kapanışta yakalanacak tüm durumların açıkça uygulama sınıfında depolanması gerekir. Çok fazla yazım ve okumak çok daha zor, çoğu zaman buna değmez.

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.