Sorunlarımın çoğunu aynı şekilde çözersem endişelenmeli miyim?


13

Programlama oyunlarını ve bulmaca yaratıcılarını / oyunlarını gerçekten çok seviyorum. Kendimi bu problemlerin çoğunu aynı şekilde tasarlarken ve sonunda gerçekten rahat olduğum programları programlamak için benzer bir teknik kullanıyorum.

Size kısa bir fikir vermek için, düğümlerin nesnelerle temsil edildiği grafikler oluşturmayı seviyorum. Bu nesne, koordinatlar, pozisyonlar ve elbette diğer komşu nesnelere referanslar gibi verileri tutar. Hepsini bir veri yapısına yerleştireceğim ve bir "oyun döngüsü" nde bu bilgilere karar vereceğim.

Bu kısa bir örnek olsa da, her durumda tam değildir. Kendimi gerçekten rahat hissetmemin tek yolu bu. Bu kötü mü?


Kendinizi tekrar etmeye devam ediyorsanız, neden yeniden kullanılabilir bir bileşen oluşturmuyorsunuz?
Kugel

Mutlaka değil, eğer onları çözmenin iyi bir yolu ise :)
haylem

4
Kendinizi sürekli tekrarlıyorsanız, bir kütüphane yazın.
İş

@Bryan Harrington tam olarak aynı problemle karşı karşıya kaldığımı, iş mantığından (işte) çekirdek programlamaya (evde) ve C # (işte) ile C ++ (evde) gibi farklı alanlarda çalıştığımı söylemeliyim bana çok yardım etti. Ayrıca açık kaynak kod okuma alışkanlığı var burada olan bazı bağlantılar :) Ayrıca, okuyabilir GOF
Chani

Yanıtlar:


26

Hayır, bu iyi.

Pratik programlamanın amacı, birçok benzer gelişmede faydalı olabilecek çözümler bulmaktır. Az önce bir tane buldun.

Sadece farklı olmaları için farklı çözümler üretemezsiniz ve yapmamalısınız. Ancak her seferinde çözümlerinize eleştirel bir gözle bakmalı ve kendilerine hala iyi olup olmadıklarını veya endüstrinin o zamandan beri ilerlemiş olup olmadığını sormalısınız ve buna göre uyum sağlamanız gerekir.


Son nokta için +1 "kendinize hala iyi olup olmadıklarını sorun veya belki de sektör ilerlemiştir". Çok sık, iyi programcıların tarihlendirildiğini ve kötüleştiğini görüyorsunuz çünkü eğrinin arkasında sıkışıyorlar ve becerilerini geliştirmiyorlar
CaffGeek

12

İyi çalışıyorsa, ona bir tasarım deseni deyin. Eğer bilmiyorsa, ancak daha iyi bilmiyorsanız, altın çekiç antipatternidir.


1
Bu. Bu sadece çözümünüzü işe yaramadığı bir soruna zorlarsanız sorun olur. Bütün sorunlar çivi varsa, gereken bir çekiç kullanmak, ama kendini bir vida içinde çekiç çalışırken bulursanız, geri adım olmalıdır.
Satanicpuppy

@Satanicpuppy ... bazen bir tornavidamız yok ve ŞİMDİ düzeltilmesi gereken bir sorunumuz var. Bu durumda, bir çekiç verilen zamanda mevcut en iyi araçtır.
CaffGeek

@Chad - rahatsız edici derecede doğru bir analoji
normanthesquid

5

Gerçekçi bir şekilde günlük işlerimizde oldukça benzer sorunlar ortaya çıkarıyoruz.

Bu durumlarda, bildiklerinize bağlı kalmak iyi olabilir. İnsanların ideal olmayan bir tekniği iyi kullandığını anlamadıkları bir şeyi uygulayan kötü çözümlere ilişkin daha fazla örnek gördüm.

Eğer iyi bir şey biliyorsanız şansınızı gerektiği gibi esnetebilirsiniz ve uygulamanızın sağlam ve etkili olacağıdır. Bunlar yeni tekniklere ilk denemenizde muhtemelen doğru olmayacak.

Ama kapak tarafı, sahip olduğunuz tek şey bir çekiçse, her şey çivi gibi görünüyor. Kendinizi alternatiflerden haberdar etmek ve belki de favorilerinizi çok ileriye doğru itmek için bir şeyler yapmalısınız.

Belki birkaç acil olmayan / kritik olmayan değişiklik seçin ve alternatif çözümlerle hızlanmak için kullanın?


4

Güzel soru ve itiraf etmeliyim ki bu da beni rahatsız eden bir şey.

Bu ne zaman iyi? Kodunuzun performans analizini yapın - O (log n) veya O (n) veya O (n log n) içinde olduğunuzu görürseniz ve bu nedenle sorun bilinen veri yapılarıyla eşleştirilebiliyorsa, genellikle sorun olmaz.

Bu ne zaman iyi değil? Zaman veya alan karmaşıklığınız O (n ^ 2) veya daha kötü ya da tanım gereği NP tamamlandı. Bu durumlarda, biraz sezgisel tarama uygulamanız, diğer alanlardan bilgi vb. Uygulamanız gerekir.

Kısa örnek: Yonga tasarımında, devredeki kapıların minimum güç için nasıl düzenleneceğini seçmek NP-tamamlanmıştır. Sadece grafikler sadece bir zorunluluk olmasına rağmen çok iyi yapmaz. Ek materyalleri okumalısınız, çoğu zaman disiplinler arası ve bilgiyi alanınıza uygulamanız gerekir. Örneğin genetik algoritmalar (biyolojide (101) tanımlandığı gibi genetik geçişleri ve mutasyonu taklit eden algoritmalar) donanım çiplerinin tasarımında çok fazla uygulamaya sahiptir.


3

Mutlaka değil, eğer bunları çözmenin iyi bir yolu varsa :)

Genellikle bir "çözüm" üzerinde çalışırken, sırayla şu şeyleri giderim:

  • basitlik ,
  • tekrar kullanılabilirlik ,
  • ve sadece son performans .

Bu performans önemli değil: Performansı göz önünde bulundurarak tasarlıyorum, ancak çok fazla itmeden (yani StringUtils.isEmpty gibi bir yardımcı yönteme veya aynı akışta böyle bir şeye çağrı yapmam gerekirse, ' t). Daha sonra performansa ihtiyaç duyulursa (iş vakası veya kullanıcı deneyimi sorunu), basit ve tekrar kullanılabilir olandan farklı bir yaklaşım benimserim. Pragmatik olmak.

Garip bir şekilde, C kodlama yaparken, Java kodlamadan çok performans hakkında daha fazla önem veriyorum ... Alışkanlık gücü :))


2

Sorun etkili bir şekilde çözüldüğü sürece endişelenmenize gerek yok.


2

Bence grafik, kararları / seçimleri temsil edecek oyunlar tasarlamak için uygun bir tasarım. Sadece bunun rafine edilebileceğini ve daha verimli hale getirilebileceğini ve bunun diğer alanlar için en iyi çözüm olmayabileceğini unutmayın.


2

Çalışırsa, sorun değil.

Tek bir tekniğe aşırı güvenmekten endişe ediyorsanız, çözümünüzü işe yaramaz hale getirecek bazı çözülmüş problemlerin varyasyonlarını bulmak için bir egzersiz olarak deneyin. Her zamanki işleminizin uygulanabilirlik alanını tanımlamak için değişiklikleri genelleştirebilirsiniz.


2

Sorunu çözerseniz, iyi. Ve daha fazla sorun yaratmayacak kadar önemli değil.


0

Hedefiniz bir ürün üretmekse "Geliştirici Sanatı" aslında doğru cevaba sahiptir. Ve "fabrika" o zaman serin tatmin ürünleri üretirse.

Fakat...

Eğer bir şeyler yapmanın yeni (ve potansiyel olarak daha iyi) yollarını öğrenmek istiyorsanız, bazı şeyleri değiştirmeniz gerekir. Bu başarısızlıklara yol açacaktır, ancak gerçekten başarısızlıkla öğrenilir. Ve bu yeni öğrenme sayesinde daha iyi ve daha çekici yazılımlar üretebilirsiniz.

Bu aslında nörolojik araştırmalarla desteklenmektedir. Al işte ozaman, buyur.

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.