deneyimli C ++ mühendisleri ekibine OOP / OOD'yi tanıtmanın en iyi yolu


17

Mevcut ekip üyelerine OOP kavramlarını tanıtmak için bir hakaret olarak ortaya çıkmayan verimli bir yol mu arıyorum? Takım arkadaşlarım OO dillerinde yeni değil. Uzun zamandır C ++ / C # yapıyoruz, bu yüzden teknolojinin kendisi tanıdık.

Ancak, etrafına bakın ve büyük çaba infüzyonu olmadan (çoğunlukla kod incelemeleri şeklinde), ürettiğimiz şey sınıfların içinde olan C kodudur. Tek bir sorumluluk prensibinin, soyutlamanın veya kuplajı en aza indirmeye çalışmanın neredeyse hiçbir faydası yoktur, sadece birkaçını belirtmek gerekir. Bir kurucu olmayan ancak her örneklendiklerinde 0'a memset olan sınıflar gördüm.

Ama OOP'u her büyüttüğümde, herkes her zaman başını sallıyor ve neden bahsettiğimi tam olarak bildiğini gösteriyor. Kavramları bilmek iyidir, ancak biz (bazıları diğerlerinden daha fazla), gerçek iş sunma konusunda bunları uygulamakta çok zorlanıyoruz.

Kod değerlendirmeleri çok yararlı oldu ama kod değerlendirmeleri ile sorun sadece gerçeği sonra oluşmasıdır, bu yüzden bazı yeniden yazılmış (çoğunlukla yeniden düzenleme, ama yine de çok zaman alır) kodu sadece yazılı. Ayrıca kod incelemeleri, tüm ekibe değil, yalnızca tek bir mühendise geri bildirimde bulunur.

Ben bir sunum (ya da bir dizi) yapma fikri ile oynuyor ve daha iyi yazılmış olabilir ve refactored olabilir mevcut kod bazı örnekleri ile birlikte OOP getirmeye çalışın. Artık kimsenin sahibi olmadığı gerçekten eski projeleri kullanabilirim, bu yüzden en azından bu bölüm hassas bir konu olmamalı. Ancak, bu işe yarar mı? Dediğim gibi çoğu insan C ++ 'ı uzun zamandır yaptı, bu yüzden benim tahminim a) onlara zaten zaten bildikleri şeyleri neden söylediğimi düşünerek oturacaklar ya da b) aslında bir hakaret olarak alabilirler çünkü Onlara yıllardır olmasalar da yıllardır yaptıkları işi nasıl yapacaklarını bilmediklerini söylediler.

Bir kod incelemesinden daha geniş bir kitleye ulaşacak başka bir yaklaşım var mı, ama aynı zamanda bir ceza dersi gibi hissetmiyor musunuz?

Mükemmel tasarlanmış kod ütopik idealleri olan üniversite dışında taze bir çocuk değilim ve kimseden bunu beklemiyorum. Bunu yazmamın nedeni, aslında kağıt üzerinde iyi bir üst düzey tasarıma sahip bir kişinin incelemesini yapmamdı. Ancak sınıfları resmediyorsanız: A -> B -> C -> D, B, C ve D kodlarında hepsi hemen hemen aynı ortak arabirimi uygular ve B / C bir liner fonksiyonuna sahiptir, böylece en üst sınıf A kesinlikle yapar tüm çalışmalar (bellek yönetimi, dizi ayrıştırma, kurulum görüşmeleri ...) öncelikle 4 mongo yönteminde ve tüm niyet ve amaçlar için neredeyse doğrudan D'yi arar.

Güncelleme: Ben bir teknik liderim (bu rolde 6 ay) ve grup yöneticisini tam olarak destekliyorum. Çok olgun bir ürün üzerinde çalışıyoruz ve bakım maliyetleri kesinlikle bilinmelerine izin veriyor.



3
Onların sorumlusu veya patronu siz misiniz? Değilse, hepinizin patronu olan teknik direktör desteğiniz var mı? Eğer sadece bir adamsanız ve geliştirme derin OOP tasarımları kullanmadan yıllardır istikrarlı ve üretken ise, programcıları çalışma kodunun işe yaramadığına ve yönetiminizi boşa gitmediğinize ikna etmek için yokuş yukarı bir savaş içindesiniz para üretmek için daha iyi para.
Patrick Hughes

Bu yazıyı yaptıktan sonra, durumumla çok benzeyen ilgili bağlantılı pop-up: programmers.stackexchange.com/questions/43214/… . Tamamen aynı şey için endişeleniyorum. Sorun ekibinin 2 geliştiricileri vardı ve kesinlikle kod değerlendirmeleri ile bunu yönetmek olabilir. Takım boyutumuzla (10+) işe yarayacak bir yaklaşım arıyorum Her geliştirici ile istediğim kadar bire bir iletişim kuramıyorum.
DXM

Yanıtlar:


5

Neden SOLID ilkelerinde kısa bir eğitim geliştirmiyorsunuz ve onlara bu eğitimi vermiyorsunuz? Şu anki organizasyonumda benim için oldukça iyi çalışıyor gibi görünüyor ve kısa eğitimler vermenin aslında eğlenceli olduğunu düşünüyorum (ilgili herkes için).

Eğitimimi verdiğimde, mevcut kodda (çeşitli projelerin) patolojik "kötü" örnekleri aramak için zaman ayırdım ve ilkeleri kullanarak bunları adım adım sunarak yeniden düzenledim. Bu gösterdi ki

  1. Bu yeniden düzenlemeleri yapmak o kadar zor değil
  2. Uzun zaman almaz
  3. Nihai sonuç (dikkatle seçilmiş ;-)) orijinal koddan açıkça daha iyidir.

5

Kod incelemeleri çok yardımcı olmuştur, ancak kod incelemeleriyle ilgili sorun, yalnızca gerçeklerden sonra ortaya çıkmalarıdır.

Bir projede tasarım değerlendirmeleri yaptık.

15 dakika. Beyaz tahtada. Kodlamadan önce tasarım boyunca konuşun.

En önemli kısım, herhangi bir uygulama çalışmasından önce tasarım incelemesinin planlanmasıdır .

Ayrıca büyük, terli bir anlaşma olan "Kritik Tasarım İncelemeleri" vardı. Çok sayıda belge ve uzun bir sunum içerdiler. Programlanması zordu ve neredeyse her zaman kodlama başladıktan sonra değerlerini sıfıra indirdi.

Kodlamadan önce - gayri resmi tasarım incelemeleri - baskı yok - dokümantasyon yok - sorumlulukların nasıl atandığı ve nesnelerin nasıl işbirliği yapacakları hakkında daha iyi tartışmalara izin verir.


Evet, tasarım incelemelerini tam olarak tanımladığınız şekilde yapıyoruz. Sorun orta büyüklükteki görevlerdir. Görev yeterince büyükse, genellikle ilk sınıf diyagramı bulmak için zaman ayırırım ve daha sonra ekip tarafından rafine edilir. Görev küçükse, mevcut üst düzey tasarım zaten yeterince iyi. Ancak, orta büyüklükteki görevler için, tasarıma yeterince düşünce koyma kapasitem yok, bu yüzden temel kural "en iyi muhakeme kullanın ve OOP'yi takip edin" dir. Bu görevleri kendim yapacak olsaydım, kodlamayı ve sürekli yeniden düzenleme ile iç içe geçmeyi ve ...
DXM

... kodun nihai tasarımın nasıl görüneceğine karar vermesine izin verin. Ancak, bu görevleri bazı ekip üyelerine bıraktığımda, bazen kod incelemesinde bulduğum şey, ilk yazımda açıkladığım gibi şeyler.
DXM

1
@DXM: Ne? Onları mı yapıyorsun? Yoksa yapmıyor musunuz? Büyükse, tasarım değerlendirmeleri yapmıyorsunuz - başka biri için tasarım yapıyorsunuz - tasarım yaptığınızda kim öğreniyor? Küçükse, tasarım incelemelerini yapmıyorsunuz - "mevcut tasarım yeterince iyi" - tasarımı görmezden geldiğinizde kim eğilir? Orta düzeydeyse, tasarım yapmazsınız ve tasarımlarını da gözden geçirmez misiniz? Aslında gerçek tasarım incelemeleri yapıyormuşsunuz gibi gelmiyor. Neden olduğunuzu söylüyorsunuz ve sonra olmadığınız yerde üç örnek veriyorsunuz?
S.Lott

@Lott: Cevabınız üzerine düşününce tek sonucum kesinlikle haklı olduğunuz. Söylemeliyim ki, bu fikri en az 8 kez gündeme getirdim ve herkes hep aynı fikirdeydi, ama evet, yerleştiğimiz ritime tekrar bakarsam, gerçekten hiçbir şey yapmıyoruz. Bunu daha ayrıntılı olarak tartışmak istiyorum, ama zaten kesinlikle bir soru-cevap sitesinde tartışmak için mods tarafından disiplinli oldum. Sohbete geçebilir miyiz? Durumu daha fazla açıklamak istiyorum ve belki de beyninizi (veya katılmak isteyen herhangi birinin) biraz seçin. Hiç sohbet etmedin, nasıl çalıştığını biliyor musun?
DXM

@DXM: Sohbet önemsiz. Ve çok yararlı değil. Bu ilk sorudan daha ayrıntılı başka sorularınız varsa, bu daha ayrıntılı soruları sormalısınız. Mesele bu. Bazı durumlarda "daha fazla tartışma", "aşağıdaki nedenlerden ötürü sorumun cevabını beğenmedim ..." anlamına geliyor ki bu biraz aptalca. Bir cevabı beğenmemek, bir cevabı beğenmemek demektir ve herhangi bir tartışma gerektirmez. Birkaç durumda tartışma "sorum belirsiz değil, sadece okuyamazsınız" anlamına gelir. Yararsız, gerçekten. Sorularınızı sorun. Soru olarak.
S.Lott

4

Bazı geliştiricilerden daha genç olduğunu, ancak besin zincirinde daha yüksek olduğunu varsayıyorum.

Downvotlara gömülme riski altında, 'deneyimli mühendisler' aslında doğru olanı yapıyor olabilir - veya bu onlarca yıldır var olan olgun bir ürün olduğundan, bir zamanlar doğru olan şey olabilir.

Eski kod, zamanın donanımında hızlı çalışacak şekilde optimize edilmiş olma eğilimindedir; diğer şeylerin yanı sıra bu, miras seviyelerini azaltmak ve işlev / yöntemden kaçınmak önemsiz operasyonlar gerektirir.

Derleyiciler yıllar içinde çok daha akıllıdır, bu yüzden bir zamanlar gerçek olan her şey değildir - örneğin, bir derleyici küçük bir işlevi satır içine almayı seçebilir.

Belki de ileriye doğru bir yol farklı bir yaklaşım benimsemek olacaktır - geliştiricilere yöntemlerinin size öğretilen teoriden nasıl / neden daha iyi olduğunu açıklamalarını isteyin - ve bu konuda samimi olun.


0

Her yeni / değiştirilmiş yöntemin % 100 şube kapsamı ile birim testleri yapmak, yöntemler arasındaki bağlantıyı en aza indirmeye yol açmaz.


UT iyi bir fikirdir, ancak bunun istenen sonucu elde edeceğine ikna olmadım. Ayrıca, OO'nun temel ilkelerinden biri, fonksiyonlar arasındaki bağlantının kaçınılmaz olması, bu yüzden bu açık ve gruplanmış fonksiyonları tek bir sınıfta gruplandırmanız daha iyi olur.
MSalters

"İşlevler arasında her bir bağlantının kaçınılmaz olduğunu" kabul ediyorum. Bununla birlikte, iyi tasarım, her bir işlevin de bağlı olduğu diğer işlevlerin sayısını azaltır. (Bir sınıf bu amaçla sadece bir araçtır)
Ian

0

Dörtlü Çeteden "Tasarım Desenleri" kitabını almak isteyebilirsiniz. C ++ 'a özgü değildir, bu nedenle iş arkadaşlarınızın C ++ bilgisine başvurduğunuzda açıkça eleştirmezsiniz. Ancak aynı zamanda alakalı olduğunu düşündüğünüz konuları da ele alır. Ayrıca, kitap yaygın olarak ilgili olarak kabul edilir, bu yüzden teorik veya pratik olarak kolayca reddedemezler.

Öte yandan, C ++ 'ın ne tasarımda ne de pratikte saf bir OO dili olmadığını düşünün. Tüm kurucu / memset öyküsü sesleri, C ++ 'ya özgü bir OO tekniği olmayan RAII'yi tanıtmalısınız (maalesef - .Net'in IDispose, RAII sonradan düşünüldüğünde ne olacağını gösterir). Buradaki ilgili kitaplar (Daha) Etkili C ++ ve (Daha) Olağanüstü C ++.


2
Ancak yazarlar, tasarım modellerinin genel olarak OOP / OOD için bir giriş olmadığını açıkça belirtiyorlar! İzleyici, öncelikle bir hardcode tasarım modelleri kataloğuna dalmadan önce OOP'un sunduğu tekniklere aşina olmalı! "Baş İlk Tasarım Desenleri" iyi bir giriş yapacak.
Falcon

2
OP açıklamasından, OOP / OOD'yi tanıdıkları anlaşılıyor, sadece kullanmıyorlar (belki de çok karmaşık olacağından korkuyorlar), bu durumda neden yararlı olduğunu açıklayan bir kitap, kod örneklerinden daha iyi motive edebileceğini açıklıyor.
wildpeaks

@wildpeaks: OP tam tersi. OOP / OOD bilmiyorlar. OOP'u prosedürel bir şekilde programlıyorlar. Onları tasarım teknikleriyle tanıştırmak için bir şeye ihtiyaçları var ve GoF kitabı bu senaryoya uymuyor.
Falcon

Ben cümlelere atıfta bulundu But every time I bring up OOP, everyone always nods and makes it seem like they know exactly what I'm talking aboutve My teammates are not new to OO languagesancak onlar sadece OOP bilerek yalan olabilir gibi ben gerçekten biraz belirsiz nasıl görebilirsiniz zaman bu konuda onlara OP konuşur.
wildpeaks

1
@MSalters - Tasarım Kalıplarının Önsözü: "Bu kitap, nesne yönelimli teknolojiye veya tasarıma bir giriş değildir. Birçok kitap zaten iyi bir iş çıkarmıştır. Bu kitaplar, en az bir nesne yönelimli programlama dilinde makul düzeyde yetkin olduğunuzu varsayar ve nesne yönelimli tasarım konusunda da deneyim sahibi olmalı. " Bu kitap şartlara uymuyor. Bazı giriş seviyesi OOD kitaplarını okumalıdırlar.
Falcon
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.