Neden farklı sınıflardaki program kodunu ve grafik arayüz kodunu paketlemek en iyi uygulama olarak kabul edilir?


15

Bu yüzden öğretmenim, program kodunu ve grafik arayüz kodunu aynı sınıflarda kapsüllememenin çok önemli olduğunu söylüyor, ancak onları tamamen bağımsız tutmak. Şu anda içinde bir ızgara ile bir iphone oyunu yazıyorum. benim için aynı "Izgara" sınıfında hem grafik ızgarayı hem de teknik kodu oluşturmak çok daha mantıklı. Diğer programcı bu konuda kaşlarını çatır mı? Grafiksel arayüzü ve kodu bağımsız tutmak gerçekten çok önemli mi? Yapmazsam ne gibi sorunlar ortaya çıkacak?

Teşekkür ederim!

EDIT: teşekkürler çocuklar! İlk önce projeyi yazmak ve sonra endişelerin tasarımını ayırmak için kodu kopyalamak benim için uygun olur mu? Bunun amacı tamamen yenebileceğini biliyorum, ama aynı pratik olarak ... Yani bir dahaki sefere bu tasarım desenini baştan uygulayabilir miyim?

Yanıtlar:


17

Öğretmeninizin bahsettiği kavram Endişelerin Ayrılması olarak adlandırılan bir kavramdır.

Bağlamınızı göstermek için, programınızı tamamlar ve ardından Android'e taşımak istediğinize karar verirseniz; ızgara mantığını ayrı tuttuğunuzdan çok daha fazla kod yeniden yazmanız gerekir.

Bir arayüz kontrolü sadece söylendiğini çizmeyle ilgilenmelidir, ızgara mantığı nasıl çizileceğini değil, sadece ızgarada bulunanlarla ilgilenmelidir.

Bu yardımcı olur mu ?


Teşekkürler yardımcı oldu. Mesele şu ki, bir sınıfta her ikisini de kapsüllediğimde nihai ürünümü görselleştirmek benim için çok daha kolay. Bu, “endişelerin ayrılması” nı takip etmememin geçerli bir nedeni mi? Yoksa kesinlikle gerekli mi ve kendime uygun bir programcı diyemedim: p?

Bu ayrılmanın olumlu bir etkisi, örneğin gui'nizi değiştirmeyi seçerseniz oyun mantığınızı yeniden yazmak zorunda kalmamanızdır

@John - Tasarımınızı görselleştirmeniz gerekiyorsa bir özellik belgesi yazın. Bunu tanımlayabilirseniz, grafik arayüz kodunu oyun mantığının kendisinden ayırmaya başlayabilirsiniz.
Ramhound

3
Ayrıca şebeke kodunun test edilmesini kolaylaştırır. GUI'leri test etmek acı vericidir (ortamlardan olası karışıklık sorunları nedeniyle), böylece GUI'nin test edilebilir bir şey üzerinde ince bir “açıkça doğru” katmanı olması büyük bir kazançtır. (Yine, bu Endişelerin Ayrılmasıdır.)
Donal Dostlar

1
@John: Bazılarımız en iyi yaparak öğreniriz. Bu projenin o kadar büyük olmadığını varsayarak, tek bir sınıf olarak yazmayı deneyin ve iPhone'da çalışmasını sağlayın. Şimdi "ağrı noktaları" takip ederek, onu Android'e bağlayın. Son olarak, Russ C'nin önerdiği gibi yeniden yazın. Bence mantık ve sunum ayrılmasının neden yol olduğunu göreceksiniz.
Peter Rowell

4

Bunu yapmak için daha kolay kodunu değiştirmek için . Yarın bir tablodan başka bir liste kullanmak istemezseniz ne olur? GUI'niz mantığınızdan ayrıldığında yapılması kolaydır.

Bunun yanı sıra, daha yeniden kullanılabilir kod yazacaksınız . GUI'niz teknik kodunuzu içermiyorsa, tekrar kullanabilirsiniz. Tüm seçeneklerle bir kez süslü bir ızgara oluşturun ve diğer projelerde kullanabilirsiniz. GUI'nizi ve teknik kodunuzu karıştırmanız bunu yapmanızı engelleyecektir.

Ayrıca, okunması daha kolay bir kod verir. Kılavuzunuz yalnızca GUI işlevini yapıyorsa , kodunuzu anlamak veya değiştirmek daha kolaydır .


3

Nesneye yönelik programlamanın , kodun mantıksal görevlere ayrıldığı endişelerin ayrılmasına genel yaklaşımı . Başlangıçta, bu daha fazla iş gibi görünebilir. Ancak projeniz büyüdükçe, kodunuzu izlemeyi ve yönetmeyi kolaylaştırır.

Bu nedenle, bir ızgarayı görüntülemekle sorumlu olan kodu ve bu ızgarada görüntülenebilecek verilerle ilgili kodu ayırmak daha iyi olacaktır.



0

Diğer cevaplar üzerine inşa etmek ve size bir örnek vermek için bir şekilde mantığınızı / verilerinizi ızgaraya enjekte etmenize izin vermelisiniz.

Izgara denetiminiz bir Renderyöntemi veya yöntemi gösterebilir DataBind.

class GridControl
{
    public Render(GridData data) { ... }
}

veya

class GridControl
{
    public DataBind(GridData data) { ... }
}

Daha sonra mantıksal biriminiz GridControl'ü alabilir ve bir veri nesnesini ona bağlayabilir veya her değişiklik olduğunda veri nesnesiyle render işlemini manuel olarak çağırabilir.

GridLogic'inizin GridControl'e bir referansı olmalıdır, böylece gerçekleşen girişlere / olaylara bağlanabilir.

Veri bağlamanın arkasındaki fikir, şebeke kontrolünüzün verileri herhangi bir değişiklik için izlemesi ve kendini oluşturma işlevi olarak mantık biriminizin kontrolü manuel olarak yeniden oluşturması anlamına gelir.

Her iki şekilde de mantığınızı ve ızgarayı bu şekilde bölmek, hiçbir şeyi bozmadan birini daha kolay değiştirmenizi sağlar. ListControlTüm mantığınızı yeniden yazmak zorunda kalmadan verilerinizi ızgara yerine liste olarak göstermek için a gibi yeni bir denetim de yazabilirsiniz.


0

MVC mimarisine bir göz atmanızı şiddetle tavsiye ederim .

Bahsettiğiniz kavramın ayrıntılandırılmasıdır (program kodunun ve grafik arayüzünün ayrılması). MVC, Model-View-Controller'ın kısaltmasıdır. Burada Model verilerdir, Görünüm grafik arayüz kodudur ve COntroller verileri işleyen koddur.

Bu şekilde programınızın üç bölümünü oluşturdunuz. Her bir parça, diğer iki parçada değişiklik yapılmaksızın değiştirilebilir.


0

Bu, gerçekleşmeyi bekleyebileceğiniz gelecekteki değişikliklerin türüne bağlıdır. En aza indirmek istediğiniz, her bir işlevsel değişikliği doğru bir şekilde uygulamak için gereken manuel kod değişikliklerinin sayısıdır.

MVC kazanırsa, değişiklikler V parçasına veya "Görünüm" ile sınırlıysa.

Benim durumumda, bu onlar eğer daha iyidir, böylece değişiklikler üç parçayı etkilediğini çok daha muhtemeldir değil ayrıldı. Ne demek istediğimi göstermek için, uzun zamandır Dinamik İletişim Kutularında geliştirdiğim , "kullanıcının adı düzenlemesine izin ver ve tamamlandığında XYZ yap" gibi yeni bir gereksinimin kaynak koduna tek bir blok olarak girildiği bir teknik kullandım. Metin:

if(deTextEdit(&sName)){
  // do XYZ
}

birden çok ayrı düzenleme yerine, düzenleme alanının var olduğunu belirtmek, bunun için benzersiz bir tanımlayıcı oluşturmak, model değişkenine bağlamak ve onu kayıp odak olay işleyicisine bağlamaktır.

Bu bağlantıya giderseniz daha karmaşık bir örnek göreceksiniz.

Temel olarak amaç, amacı gerçekleştirmek için yapılan düzenleme sayısını en aza indirgemek için kodu alana özgü bir dile dönüştürmektir. Bunu yapmak istemenizin sebebi sadece çabayı azaltmak değil, düzenlemelerin bir veya daha fazlasını unutup yanlış kodlayarak hataları ortaya çıkarma fırsatını azaltmaktır. Ayrıca kaynak kodunun boyutunu kabaca bir büyüklük sırasına göre azaltır.

Ücretsiz değil. Programcı için bir defalık bir öğrenme eğrisi sunar.


0

Grafik arayüzü sisteme bağlıdır, oyun çekirdeği üzerinde çalıştığı sistemden tamamen bağımsız bir algoritmadır. İki appartın tutulması, programın bakımını, testini ve hata ayıklamasını kolaylaştırır, çünkü bir alt sistemdeki değişiklikler diğerinin çalışma şeklini etkilemez. Taşınabilirliği önemsemeseniz bile, bahse girerim, programınızın sağlamlığını ve sürdürülebilirliğini önemsersiniz.

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.