2010-04-07 12 views
5

Grafik üzerinde bazı işlevler çizmeme izin verecek bir uygulama tasarlıyorum. Her fonksiyon, bu grafik sınıfına geçeceğim bir dizi noktadan çizilecektir."Tanrı nesnesi" haline gelmeyecek şekilde bir sınıf tasarlama

Bir MyPoint sınıfından miras alınan farklı türlerde noktalar vardır. Bazı tür noktalar için, onları ekranda olduğu gibi basacak, diğerleri göz ardı edilebilecek, diğerleri ekleyebilecek, böylece karmaşık olabilecek karmaşık bir mantık var.

Grafik nasıl çizilir, burada ana sorun değildir. Beni rahatsız eden şey, bu mantıksal mantığın nasıl yapılacağı, bu GraphicMaker sınıfının Tanrı-Nesnesi olarak adlandırılmamasıdır. Böyle bir şey yapmak kolay olurdu

:

class GraphicMaker { 
    ArrayList<Point> points = new ArrayList<Point>(); 

    public void AddPoint(Point point) { 
     points.add(point); 
    } 

    public void DoDrawing() { 
     foreach (Point point in points) { 
      if (point is PointA) { 
       //some logic here 
      else if (point is PointXYZ) { 
       //...etc 
      } 
     } 
    } 
} 

Nasıl böyle bir şey yapsın? Ben her noktası bir nesne üzerinde çizim mantığı koymak olacağını doğru yol his var (şimdiye Point dan her çocuk sınıf kendisini nasıl çizileceğini bilemez) ancak iki sorunlar ortaya:

  1. puan türü vardır olacağını kendilerini çekmeyi öğrenmek için GraphicObject sınıfında bulunan diğer tüm noktaları bilmeniz gerekir.
  2. Grafik sınıfındaki birçok yöntem/özellikten yararlanabiliyorum, böylece tüm noktaların Grafik sınıfına bir referansı vardır ve tüm mantıklarını istedikleri gibi yapabilirler, ancak bu büyük bir fiyat değildir. Tanrı sınıfına sahip olmak istemediğin için öde mi?

cevap

4
Sana Önerilen yapmak ve ona diğer noktaların dizi geçen kendini çizmek için her nokta sorumlu kılacak

:

interface ICanDraw { 
    void Draw(ArrayList<Point> allPoints); 
} 

public abstract class Point : ICanDraw { 
    ... 
} 

public PoniePoint : Point { 
    public void Draw(ArrayList<Point> allPoints) { 
     // do drawing logic here 
    } 
} 

sizin GraphicMaker için:

public void DoDrawing() { 
    foreach (Point point in points) { 
     point.Draw(points); 
    } 
} 

(Benim Java biraz paslı, bu yüzden% 100 sözdizimi Java'yı düzeltmeyebilir, ancak önerimi ilettiğini düşünüyorum).

+0

Aha! GraphicObject sınıfının Point's Draw() yöntemine argüman olarak puan listesini vermeyi düşünmemiştim. Bu çok iyi bir fikir gibi görünüyor. Her ne kadar hala emin değilim, ancak tüm olası özellikleri sadece GraphicObject sınıfında herkese açık hale getirmek için değil, belki de gelecekte tüm noktaların listesi değil, başka bir şeyle ilgili nokta çizim mantığına ihtiyacım olacak. Mülkün herkese açık olması yerine listeyi geçersem, point'in Draw() yöntemlerine yeni parametreler eklemem gerekir. –

+1

Bu gerçekten GraphicsObject'in nasıl çalıştığına bağlıdır, ancak bunu Draw yöntemine aktarmamayı tercih ederim (yanlış olabilir, bağlamsal ve tam bağlamım yok).GraphicsObject'in sağlayabileceği bir bilgi alt kümesine ihtiyaç duyduğunuzu ve tüm Noktaları bulursanız, yalnızca bir Grafikler Listesi içeren bir Çizelge Listesi ve GraphicsObject öğesinin ek öğelerini gösterme amacıyla bir sınıf oluşturmayı düşünürdüm gerekir. Bu, tek bir yeniden yüklenebilirlik ve endişelerin ayrılmasını sağlar. NASIL - Eğer GraphicsObject çizim ile ilgiliyse onu iletin. –

+3

Mevcut sistemlere ilham almak için bir göz atın. Swing'de, her bileşenin bir Grapics nesnesinden geçen kendi boyası() vardır. Kap/Düzen/Bileşen yaklaşımı, bazı bileşenlerin diğer (içerilen) bileşenleri etkilemesine izin verir. Ancak, listeyi yine de Point'in Draw'a iletemedim. Diğer noktaların listesini döndüren GraphicsObject'e bir sorgu ekleyelim. Belli bir türdeki noktalar gibi, bazı uzaklıklarda, aynı renkte, vb. –

3

Noktanın her bir alt sınıfının, temel Point sınıfındaki birini geçersiz kılan kendi çizim yöntemine sahip olması doğrudur.

Çizim yöntemi, bazı noktalardan biri olan noktaların listesi de dahil olmak üzere, nokta çizim yöntemlerinde kullanılması gereken her şey için ortak yöntemleri/özellikleri olan grafik nesnesine bir başvuru almalıdır. çizim yöntemleri gerekir.

Grafik sınıfında genel yöntemler oluşturma konusunda neden endişe ediyorsunuz? Kod büyüdükçe, birkaç ekstra görünür yöntem, her şeyi yapan çok büyük bir yöntemden çok daha az kafa karıştırıcıdır.

+0

Evet, haklısınız. Bazı kamu özelliklerinin/yöntemlerinin olması, buraya gitmenin yoludur. –

İlgili konular