Ekip üyeleri arasında genel programlama bilinci nasıl yayılır?


20

İnsanların inandığı bir ortamda kalıyorum:

  1. Java jenerikleri, gerçek kodlama için değil, sadece kütüphane yazmak için kullanılan özelliktir.
  2. C ++ bir OO programlama dilidir; templateisteğe bağlı ve önlenebilir bir özelliktir

Yine de, bu insanlar genel programlama (örneğin, STL, Java kapsayıcıları) kullanılarak yazılan kitaplıklara güvenmektedir. templateS veya kullanarak bir kod yazarsam generics, kod inceleyicisi bunu reddetme olasılığı yüksektir ve "uygun / anlaşılabilir / zarif" bir şekilde yazmak için yorum yapar .

Böyle bir zihniyet normal programcıdan en üst düzey yöneticiye kadar uygulanabilir. Bir çıkış yolu yok, çünkü zamanın% 90'ında bu insanların lobileri var.

Onları açıklamanın en iyi yolu ( boğaz kesilmemek ), OO ve genel programlamayı oluşturan kod yazmanın pratik yaklaşımı aynı anda mı?


11
Size iyi şanslar diliyorum, ama yolunuzu istiyorsanız muhtemelen ayrılmak zorunda kalacaksınız ..
Muffin Man

3
@TheMuffinMan, haklısın. O işyerinden ayrıldım ve şimdi kendi şirketim var. Burada kodlama üzerinde tam kontrole sahibim!
iammilind

Yanıtlar:


14

Dünyada insanlar hala var yok kullanım jave jenerikleri "sıradan kodlama." C ++ şablonları ile inanıyorum, ama jenerikler? Öğrenmesi / kullanması bile zor değil. Cidden Java ve C ++ 'ın en iyi özellikleri sırasıyla jenerikler ve şablonlardır.

İnsanları bir şeylere ikna etmenin en iyi yolu, zorlayıcı bir tartışmada bulunmak, tehdit edici olmamak ve haklı olmaktır.

Programlama diliniz olarak şablonları kullanmak gibi bir şey yapmadığınız sürece, parametrik polimorfizm (jenerikler / şablonlar) neredeyse kesinlikle iyidir.

1. Kod çoğaltmasını önler.

Bu açıktır, ancak polimorfik kod genel koddur. Bu yüzden jenerikler denir.

2. Daha iyi statik kontrolü destekler.

Parametrik polimorfizm olmadan , sadece iğrençlik gibi public Object clone()veya public boolean equals(object b)olmayan şeyler yazıyorsunuz , ne yaptıkları hakkında hiçbir bilgi sağlamayan türlere sahipler ve her yerde istisnalar atıyorlar. Parametrik polimorfizme alternatif her yerde dökümdür

3. Parametrik olmayan polimorfizm OOP kodu temel olarak "ikili yöntemleri" doğru bir şekilde işleyemez.

Bunları sık sık kullanıyorsunuz.

4. en iyi uygulama

Java'da jeneriklerin kullanımı en iyi uygulama olarak kabul edilir (Josh Bloch'un Etkili Java'sına bakın). Sutter ve Alexandrescu gibi büyük C ++ düşünürleri de çeşitli sorunları çözmek için şablonların kullanılmasını teşvik eder.

5. OO paradigmasına uyar.

İnsanlar genellikle bunu fark etmezler, ancak alt yazım ve jeneriklerin kombinasyonu, bunlardan sadece birine sahip olan herhangi bir sistemden çok daha güçlü bir ifade ve nesne yönelimli bir sistem üretir.

Scala'nın karışımlarını düşünün. Bunlar, nesnelerinizi bileşen parçalarından bir araya getirmenizi sağlayan güzel bir özelliktir. Jenerikler ve şablonlar bu avantajlardan bazılarını simüle edebilir. Örneğin, nesnelerinizden birinin bir veritabanı kullandığını varsayalım. İyi tasarım, veritabanı erişimini ayrı bir sınıfa özetlemenizi sağlar. Doğru yapılırsa, bu sadece veri deponuzu (test edilebilirliğin anahtarı) taklit etmenize izin vermekle kalmaz, aynı zamanda bu yeni sql veritabanı gibi alternatif uygulamalar da ekleyebileceğiniz anlamına gelir. Ancak burada, hangi uygulamayı kullandığınızı dikkate alarak bir sorunla karşılaşabilirsiniz, iş nesnenizin farklı yeteneklerini elde edersiniz.

Kurtarma jenerikleri!

   public class Business<S extends Datastore>{
      private S store; ...
   }

Artık Businessveritabanına özgü özellikleri kullanma yeteneğine göre nesnelerinizi statik olarak farklılaştırmaya başlayabilirsiniz . Hala çalışma zamanı denetimlerine ve dökümüne ihtiyacınız var, ancak çok daha iyi kod oluşturmaya başlayabilirsiniz.

ve

6. Normal kod mevcut değil.

Programlama evreninde sadece üç şey vardır:

  1. kütüphaneler,
  2. yapılandırmalar ve
  3. hatalı kod.

Kodunuzu bir kütüphane gibi düşünmüyorsanız, projenizin gereksinimleri değiştiğinde ciddi bir sorunla karşılaşırsınız. Mimari (tartışmalı olarak) iyi API'ler tasarlama sanatıdır.

Bu tutumu çarpıcı buluyorum. Parametreli türlerle programlamaya alıştıktan sonra, bunları kullanmamak her şeyi bir acı haline getirir. Ve Java ve C ++, düzeltmeye yardımcı oldukları bir grup kaba noktaya sahiptir.


7
Ben kavramı gibi normal code: var ve orada sadece üç çeşit olduğunu gelmez libraries, configurationsve bad code. İdealist bir akıl yürütme olsa da, yine de sizin kadar idealist olmayabilecek olsa da, iş arkadaşlarınıza açıklamanız gerekir. Parametreli türleri kullanmanın bir kez asıldığınızda harika olduğunu kabul ediyorum .
Spoike

3
Heck, eğer şablon metaprogramlama amaçları için kullanmazsanız, C ++ şablonları kullanmak o kadar da zor değildir. :-)
In silico

-1, jenerik ilaç kullanmamaya karar veren herkesin sadece özelliğin nasıl çalıştığını bilmedikleri için yaptığını önerdiğinden dolayı.
tp1

kötüye kullanım potansiyeli göz önüne alındığında, jenerik / şablon kullanmanın kısıtlanmasının / kullanılmamasının kredi verdiğiniz için çok daha iyi bir karar olabileceğini söyleyebilirim.
Ryathal

Büyük ölçekli yazılım mühendisliği için jenerikler / şablonlar kullanmayı reddeden insanlar, yanlışlıkla ve kaçınılmaz olarak bir "ikinci dil" - Java üzerinde çalışan, aklında ne olursa olsun "iş dilini" uygulayan bir tercüman oluşturacaklardır. en.wikipedia.org/wiki/Inner-platform_effect
rwong

16

Bu, daha genel bir soru olan "amirlerinizi daha yeni ve daha iyi bir teknoloji / bir şeyler yapma yöntemi kullanmaya nasıl ikna ediyorsunuz?"

Ne yazık ki yapabileceğinizi sanmıyorum ve yapmanız gerektiğinden emin değilim. Bu onların tanımı gereğidir, çünkü bir şeyleri istediğiniz gibi değil, seçtikleri belirli bir şekilde yapmanız için ödeme yaparlar. Yapabileceğiniz en iyi şey, bu teknolojinin dışarıda olduğunu, birçok insanın onu kullandığını ve geleceğin yolu olduğunu gösteriyor. Tabii ki zaten bilmeleri gerektiği gerçeğinden bile bahsetmek isteyebilirsiniz: insanların yeteneklerinin durgunlaşmasına izin vermemenin en iyisi olduğunu. Ama hepsi bu: Eğer satın almazlarsa, yapabileceğiniz hiçbir şey yok.

Sahip olmadığınız başka düşünceler de olabilir, çünkü onların düzeyinde düşünmüyorsunuz. Bir mühendis olarak düşünüyorsunuz, onlar daha çok iş açısından, hatta insan kaynakları açısından düşünüyor olabilirler.

  • Jenerikler (veya her ne olursa olsun) ürünlerinin değerini artıracak mı? Muhtemelen değil.

  • Jenerikler (ya da her neyse), zaten işlerini yapmak için işe aldıkları insanları zorlaştıracak mı? Evet.

  • Jenerikler piyasaya çıkış süresini iyileştirecek mi? Tek mühendis sen olsaydın, belki. Ancak, bir grup mühendisin evde başka bir kod satırı yazılmadan önce jenerikler hakkında eğitilmesi gerekiyorsa, Hayır.

Yani, sadece işleri değiştirmeyi düşünebilirsiniz. Son işimde Java ile jenerikleri ilk kullanan kişiydim ve neyse ki onunla bir problemleri yoktu; jeneriklerin kodu 'okumayı zorlaştırdığı' endişesini dile getirdiler, ama bana izin verdiler. Böyle bir iş bul.


9

Herhangi bir inceleme öncesinde kod gözden geçiren ve diğer meslektaşları için jenerik özelliklerini yayın:

1) Genel bir sınıf veya yöntemle üzerinde çalışılan türleri belirtmenize izin vererek, jenerikler özelliği tür güvenliği yükünü sizden derleyiciye kaydırır. Derleme zamanında uygulandığından doğru veri türünü test etmek için kod yazmaya gerek yoktur. Tip döküm ihtiyacı ve çalışma zamanı hataları olasılığı azalır.

2) Jenerikler, çoklu uygulamaların yükü olmadan tip güvenliği sağlar.

Böylece, [1] ve [2] koddaki hata riskini azaltır. Bu, geliştirici zamanından ve dolayısıyla şirketten tasarruf sağlar.

Okunabilirlik bir sorunsa, jenerik tiplerin kullanılmasının uygunsuzluğu tehlikeye girebilir. Bu, kodlama yönergelerini uzatmak isteyebileceğiniz nedenlerden biridir. Bu, yalnızca kütüphaneleri genişletmek için değil, iş günü bağlamında da yapılabilir (ancak, ileride kolay tanıma için koddaki kütüphaneler için olası aday yöntemleri işaretlediğinizde yeniden düzenleme yapmak bir fikirdir). Bu nedenle, bunları geçici bir bağlamda kullanmamak için hiçbir neden yoktur.

Diğer programcıların jeneriklerle nasıl sorunları olmadığı hakkında birkaç ifade ekleyeceğim: Jenerikler Java'da ve C # gibi birçok dilde yaygın olarak kullanılmaktadır. Herhangi bir ciddi programcı bu tip güvenli yapı taşları olmadan hayatı zor bulabilir.

Bununla birlikte, bazı geliştiricilerin çizilmeyebileceğini düşünmek isteyebilirsiniz. Yönetim geçmişte projeleri korumak için bilinçli bir karar verebilir ve böylece bu ahırları tehlikeli alanlardan uzak tutabilirdi. Burada, yeterli analiz veya mikro yönetim nadiren yapıldığından, hem masum hem de suçlu genellikle suçu alır.

İyi bir vakayı ortaya koyarsanız ve karşılığında makul bir yanıt almazsanız, gizlice programlamayı ciddiye alan başka bir şirket aramaya başlayın.


7

Mimar / teknoloji lideri değilseniz, jenerik / şablon kullanmanız zorunludur. Genel / şablon çözümünü, kod incelemesinden çok önce, tercihen uygulamaya başlamadan önce önermelisiniz.

Yapabileceğiniz şey, bazı durumlarda neden jenerik kullanmanız gerektiğini göstermektir. Avantajları gösterebilirseniz, iş arkadaşlarınız aynı fikirde olabilir. Jenerik / şablon kullanmanızın olası nedenleri aşağıdaki gibi olmalıdır:

  • Tekrarlayan görevler için daha az kod yazmanıza izin vermelidir
  • Programcıların işini kolaylaştırır
  • Çözüm mimarı tarafından belirlenen bir deseni uygular
  • Programcıları kodu kopyalayıp yapıştırmamaya zorlayan ortak özellikleri kapsar (yani çift bakım probleminden kaçınmak)
  • Kodunuzu makul bir şekilde gelecekte kanıtlar (bu caddenin akla gelmesi zor olsa da)

Son zamanlarda yapılan bir Java projesinde bazı temel soyut sınıfları başarıyla ekledim çünkü bazı temel şeyleri tatmin etti: takımdaki diğerleri için işleri kolaylaştırdı , mimarın önerdiği kalıbı zorladı ve programcıların ihtiyaç duymadığı bazı ortak kodlara sahipti kopyala ve yapıştır. Mimarın makul derecede yetkin insanlar hakkında hala yanlış anladıkları (oyundaki gerçek sistemin karmaşıklığı nedeniyle) yazdığı basit bir kalıptı, ancak jenerikler hangi sınıfın nereye gittiğini işaret ediyor.

Açıkçası, gizlilik sözleşmesini ihlal etmeden gerçek örneği gösteremem. Ama yaptığımın bir örneği olarak strateji modelini yapmak ve onu jeneriklerle uygulamak olurdu. Bu strateji modeli:

resim açıklamasını buraya girin

Ve programcıların bu kalıbı zorlaması için, genel türü Contextbir Strategytür içeren bir şey kullanması üzerine ekleyebilirsiniz . Kod olarak Java'da şöyle görünecektir:

// declare the generic Context class that has a type "S" 
// that is an upper bound class of Strategy
public class Context <S extends Strategy> {
    S strategy;

    // Constructor with an initial strategy
    public Context(S initialStrategy) {
        this.strategy = initialStrategy;
    }

    public void doSomething() {
      strategy.execute(); // assumes that Strategy has an execute() method.
    }

    public void setStrategy(S strategy) {
        this.strategy = strategy;
    }
}

Bunu bildiğim kadarıyla herhangi bir desenle yapabilirsiniz. Kod tasarımına güvenmek için genel / şablon tasarımınızı birim testlerle test edebildiğinizden emin olun.

Eğer meslektaşlarınız fikri beğenmezse, kişisel olarak kabul etmiyorsanız, düşündüğünüz gibi ele almaları kolay bir çözüm olmayabilir. Bu yüzden uygulamaya başlamadan önce bir genel / şablon çözümü önermelisiniz. Gerçek problemi farklı bir şekilde çözmek için hala meslektaşlarınızla birlikte çalışmalısınız.


Diyagramı seviyorum! Hangi aracı kullandınız?
yannis

@YannisRizos Metin girişinden diyagramlar oluşturan yuml.me komutunu kullandım . Beta hizmeti şu anda biraz buggy (ancak oluşturulan bağlantıyı kullanarak oluşturulan resmi yayınınıza yükleyebilirsiniz).
Spoike

yer işareti eklendi, paylaştığınız için teşekkürler. başka bir sözdizimini gerçekten öğrenmek istemememe rağmen, ne kadar basit olsa da, havalı görünüyor ve bir noktada deniyorum.
yannis

@YannisRizos Oh, sözdizimini kendim sürekli unutuyorum. Bu yüzden kullanışlı bir örnekler sayfası var . Visio kullanmak daha yuml basit sınıf diyagramları yazmak için daha hızlı bulundu.
Spoike

@YannisRizos yUml harika bir araçtır. Burada onunla neler yapabileceğini bir kaç örnek verecek olursak: carnotaurus.philipcarney.com/tagged/yUML
CarneyCode

4

Her zaman aynı şeyi yapmanın birkaç yolu vardır. Şablon kullanımınız şablonların yanlış kullanımı ise, kod incelemesinde başarısız olmalıdır.

Ancak, kodunuz incelemeyi geçemezse, şablonları anlamadıklarından, sorun farklıdır. Bu durumda (güzel bir şekilde) şablonları öğrenmelerini tavsiye edin.


4

Burada uğraştığınız önyargıların bir koleksiyonudur. İnsanlar statükoyu tercih ediyor, bir grup düşüncesi gelişti ve tartışma birkaç kez yürütüldü, böylece insanlar inançlarına yerleşti.

Buradaki en etkili stratejilerden biri küçük bir zafere odaklanmaktır. Bir kitapta aşağıdaki örneği okudum : yazar Apple olmayan sadık bir kullanıcıydı. Onları beğenmedi ve onlarla hiçbir şey yapmak istemedi. Apple yanlısı bir tutumu olan insanlarla birçok tartışması vardı ve her biri topuklarını daha derine doğru itti. Sonra birisi ona bir iPod shuffle satın aldı ve bunun gibi, önyargıları kayboldu. Sadece Apple ürünlerini satın almak istemedi, ancak sert, yerleşik Apple karşıtı duruşun yerini daha dengeli bir bakış açısıyla değiştirdi. Uzlaşmaya yer vardı ve yavaşça tamamen Apple'a dönüştü.

Bu yüzden herkesi bir kerede ikna etmeye çalışmayın: bunun tersi bir etkisi olacaktır. Küçük bir şeye odaklanın, gerisi kendi başına gerçekleşecektir. Sadece argümanın iki taraflı doğasından kurtulun, böylece insanlar bir kerede değil, yavaş yavaş geçebilirler.

Odaklanmak için özel nokta durumunuza bağlıdır, ancak burada bir fikir vardır: Kütüphaneler ve 'gerçek kod' arasında çizdiğiniz bölüm çok doğal görünmüyor. Bana göre, bir uygulama yapan bir programcı, zamanının% 80'ini yaptığı uygulama türü için bir kütüphaneye ve% 20'sini uygulamayı oluşturmak için bu kütüphaneyi kullanarak harcamalıdır. Tutmaya değer tüm kodlar bir kütüphane olarak düşünülmelidir. Üstlerinize, kodunuzun bir kısmını bir kurum içi kütüphaneye genelleştirmenizi öneririm (henüz yapmadıysanız). Kendi mantıklarına göre, bunun için jenerikler kullanmalıdırlar ve yukarıdaki tahminde, kodunuzun% 80'i kütüphane içinde olabilir. Herkesi jenerik ilaçları diğer taraftan kullandıktan sonra, buna alışmaları gerekir ve önyargılar kaybolur.


Teşekkürler Peter, bu çok anlayışlı bir cevaptı. Düşünceleriniz sadece sorum için değil, günlük yaşamımızın genel felsefesi için de geçerlidir.
iammilind

2

"Anlaşılabilir" e dikkat edin. Kod inceleyici jeneriklerin faydasını <<<>>>görmezse, tüm -stuff sadece anlaşılamayan bir gürültüdür ve gereksizdir.

Ben aslında, hata veritabanınızın içerdiği mevcut hataların (açık veya son zamanlarda düzeltilmiş) generics kullanarak kaçınılmış olabilir bir göz olan öneririz. ClassCastExceptions öğesini arayın.

Ayrıca, jenerik ilaçlarla önlenebilecek herhangi bir hatanız yoksa, meslektaşlarınızın onlara ihtiyacınız olmayan bir noktaya sahip olduğunu unutmayın.


2

Bu konuda rahat olurdum. Birkaç yıl önce Java 1.4'ten 1.6'ya taşındım ve jenerikler gerçek bir sarsıntı oldu. Birkaç Koleksiyon, Harita ve diğer yapıları dengelemeye çalışıyorsanız, basit ve çok faydalıdır. Ancak, genel verileri parametre olarak alan, onları manipüle eden ve diğer sınıflara geçiren sınıflar yazmak anıtsal olarak kafa karıştırıcı hale gelir. Tüm işleri yapmaktan büyük memnuniyet duyuyorum, ancak harcanan zaman ve çabaya değip değmeyeceğini merak ediyorum. Ayrıca, çok sayıda Java programcısının gerçekten asamamasından korkuyorum.

Şimdiye kadar yapılan genel yolculuğumdan birkaç rastgele düşünce daha:

  • ClassCastExceptions çalışma zamanında gerçekleşir, ancak genellikle ilk birkaç çalıştırmada görünür ve düzeltilmesi kolaydır.
  • Jenerikler hakkında okuduğum her makale bazen işe yaramadığını ve @SuppressWarnings(value="unchecked")bazen kullanmanız gerektiğini belirtir . Jeneriklerin sınırlarının ötesinde olup olmadığınızı veya sadece aptal olup olmadığınızı ve daha fazla düşünmeniz gerektiğini nasıl anlarsınız?
  • @SuppressWarnings(value="unchecked")Sadece bir satıra uygulamak zor olabilir .
  • Sınıflarımdan birine süslü jenerikler ekledim. Daha önce hiç dokunmamış ve daha sonra temiz bir derleme kazanmış olabileceğimden önce sınıfı geliştirebilecek birkaç programcı tanıyorum.

Generics kodumu temizledi ve reddetmem için çok fazla sorun yaşadığım konusunda beni uyardı, ancak geliştirme süresini, eğitime harcanan ekstra zamanı ve Java programcılarının C #, C ve Visual Basic'te çalışmaya zorlandığını da görüyorum. ..veya Java 1.4. İş arkadaşlarınızın anlayabileceği kod yazmaya odaklanacağım. Anlaşılabilir bazı jeneriklere girebilirseniz, harika. Java jeneriklerini henüz çözülmemiş bir fırsat / problem olarak görüyorum.

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.