sadece tek bir yöntem adı kullanmaya çalışıyorum

4 Cevap java

PHP Form Validator programlama zaman yeni yöntemler oluştururken, ben eski yöntemleri argümanların sayısını artırmak için gerekli.

Ben, önceden test çalışma kod dokunmak yok etmektir uzanır okuduğumda Java, öğrenme zaman, ben eski yöntemleri argümanların sayısı arttı, ancak yeni yöntemler ile eski yöntemleri geçersiz olması gerektiğini düşündüm.

Eğer bir alan, bir diğer ve henüz bir diğer, formun bir bölümünde boş olup olmadığını doğrulamak için vardır düşünün.

Argümanlar farklı iseniz, argümanlar eşitse, doğru sınıf başına isEmpty, isEmpty2, isEmpty3, üç sınıfları ve bir isEmpty kullanmak için ya da ikisi de yanlış ise, ne yapmalıydım olduğunu isEmpty aşırı, ama olacak ?

4 Cevap

Yani soru şu:

If I need different behaviors for a method isEmpty ki aynı sayıda argüman alıp, ben ne yapmalıyım?

  1. Use different names? ( isEmpty, isEmpty2, isEmpty3 )
  2. Have three classes with a single isEmpty method?
  3. Other?

Bu soru ise o zaman kullanmak gerektiğini düşünüyorum:

  1. Onlar aynı mantıksal birime ait (onlar doğrulama aynı tür) ama sürüm olarak sayıları kullanmayın zaman, daha iyi yaptıklarını sonra bunları isim şudur: isEmptyUser, {[(1) ]}, isEmptyWhatever

  2. Validator nesne tek bir yerde bilgisayarlı ve programın ömrü boyunca etrafında geçti olabilir zaman. Diyelim ki: Validator v = Validator.getInstance( ... ); ve sonra olarak kullanabilirsiniz: validator.isEmpty() ve bu kadar iş polimorfizmi için izin verin.

  3. Alternatif bir sınıfta argümanları paketi ve adı hemen hemen aynı sorun ile bitireceğiz rağmen, isEmpty yöntemine geçmek olabilir. Hala oradan Refactor ve yeni sınıf sizin için doğrulama yapıyor olması daha kolaydır.

    isEmpty( new Arguments(a,b,c ) );  => arguments.isEmpty();
    

[Genellikle Bertrand Meyer atfedilen] Açık / Kapalı Prensibi "yazılım varlıkları (sınıflar, modüller, fonksiyonlar, vb) uzantısı için açık olmalı, ancak değişiklik için kapalı" diyor. Bu Java gün geldi ki prensip olabilir. Gerçek hayatta bu tamamlanmış kod uygulanır nereye doğrudan bir değişiklik yaparak elde sadelik yarardan fazla modifikasyon, yeniden test ve yeniden belgelendirme maliyeti.

Ek bir argüman gerekiyor çünkü bir yöntem değişiyor iseniz, aşağıdaki adımları kullanmayı seçebilirsiniz:

  1. Eski yöntemi kopyalayın.
  2. Kopyadan uygulanmasını çıkarın.
  3. Yeni argüman eklemek orijinal yöntemin imza değiştirin.
  4. Yeni argümanı kullanmak için orijinal yöntemin uygulanması güncellemek.
  5. Argüman için bir varsayılan değere sahip yeni bir yöntem bakımından kopya uygulamak.

Lütfen uygulama dil yöntem yüklenmeyi desteklemiyorsa o zaman prensip aynı ama yeni yöntem imzası için yeni bir isim bulmak gerekir.

Bu yaklaşımın avantajı yöntemine yeni argüman eklemiş olduğunu ve mevcut müşteri kodu derlemek ve çalışmaya devam edecektir.

Yoksa daha az orada yeni argüman için bariz bir varsayılan, ve eğer bu iyi çalışıyor.

Bu ise emin değilim aslında soru cevaplar, ama "gerçek hayatta" OO düşünmek için en iyi yolu, Nygaard Classification düşünmek için:

ObjectOrientedProgramming. Bir program yürütme dünya ya gerçek veya sanal parçanın davranışını simüle eden, fiziksel bir model olarak kabul edilir.

Peki siz kodu yapmak için çalışıyoruz ne yapmak için fiziksel bir aygıtı kurmak istiyorsunuz? Muhtemelen "Form" nesne çeşit olurdu, ve form nesnesi küçük sekmeler veya farklı Form değişkenleri temsil etmek için kendisine bağlı bit olurdu, ve sonra bir yuvaya Form nesnesi alacağını bir Validator nesnesi kuracağına geçersiz olsaydı formu geçerli ve başka olsaydı ve sonra bir ışık yanıp söner. Ya da Validator da "geçerli" yapmak için (sadece Validator anlaşılan) bir yuva Form nesne almak ve (muhtemelen aynı bir) Form nesneyi döndürmek, ancak çeşitli şekillerde değiştirilmiş olabilir. Ya da belki bir Validator part bir Form ve böylece Formu bunun dışına taşıyorsa bu Validator şeyini vardır ...

Benim açımdan, böyle bir makine gibi görüneceğini hayal etmeye çalışın ve nasıl çalışır. Sonra bu makine parçalarının tüm düşünüyorum, ve her biri bir nesne yapmak. Bu nasıl "object-oriented" doğru şeyler, "gerçek hayatta" çalışmak değil mi?

Bunu dedi, bir sınıf "uzanan" ne demektir? Eh, bir sınıf nesneler için bir "şablon" - her nesne örneği bir sınıf onu bina yapılır. Bir alt sınıfın bir üst sınıfından "miras" bu sadece bir sınıftır. interface kalıtım ve implementation kalıtım: Java'da en az iki kalıtım türü vardır. Java'da, bir defada en çok bir sınıf uygulaması (gerçek yöntemi kodu) devralmak için izin verilir, ancak birçok arayüzleri devralabilir - Birisi sınıfın dışından görebilirsiniz temelde niteliklerinin sadece koleksiyonları.

Ayrıca, OO programlama hakkında düşünme ortak bir yol yerine "yöntemi çağrılar" "mesajları" (düşünmek aslında, bu aslında "nesne çağrılacak ilk dil Smalltalk için Alan Kay tarafından icat orijinal terim, ) "odaklı. Eğer nesneye isEmpty mesaj göndermek zaman, bunu nasıl cevap istiyorsun? Eğer isEmpty mesajla farklı argümanlar göndermek ve farklı yanıt var edebilmek olmak ister misiniz? Yoksa farklı nesnelere isEmpty mesaj göndermek ve onlara farklı yanıt olmasını istiyorsun? Ya kod tasarımına bağlı olarak, uygun cevaplar.

Bunun yerine farklı isimler ile isEmpty birden fazla sürümünü sağlayan bir sınıf olan, daha esnek şekillerde bir araya koymak olabilir bir ince taneli parçalar halinde modelinizi kırmayı deneyin.

  • Create an interface called Empty with one method isEmpty(String value);
  • Create implemntations of this interface like EmptyIgnoreWhiteSpace and EmptyIgnoreZero
  • Create FormField class that have validation methods which delegate to implementations of Empty.
  • Your Form object will have instances of FormField which will know how to validate themselves.

Now you have a lot of flexibility, you can combine your Empty implemenation classes to make new classes like EmptyIgnoreWhiteSpaceAndZero. You can use them in other places that have nothing to do with form field validation. You don't have have have multple similarly named methods polluting your object model.