Ben yöntemleri veya sabit bayraklarını kullanmalı mıyım?

3 Cevap php

Ben birden fazla durumu olabilir bir bayrak içeren bir veritabanı tablosu varsa, ben bu yapmalıyım

if ($Object->isStateOne()) {
  // do something
}
else if ($Object->isStateTwo()) {
  // do something else
}
else if ($Object->isStateThree()) {
  // do yet something else
}

ya da bu

switch ($Object->getSomeFlag()) {
  case ObjectMapper::STATE_ONE:
    // do something
    break;

  case ObjectMapper::STATE_TWO:
    // do something else
    break;

  case ObjectMapper::STATE_THREE:
    // do yet something else
    break;
}

?

3 Cevap

Hangi elbette mantıklı.

Anahtar çok temiz görünüyor. Ancak, kontrol ediyoruz, bu 'devlet' nedir? Bir dize tercüme ediyorsanız, örneğin, bir dizi kullanın.

Eğer anahtarı farklı davranış vardır. Yöntem çağrıları yan etkileri olabilir. Birden devletler olsa da, bir kerede bir nesne üzerinde etkin olabilir eğer daha iyi olduğunu.

OO açısından, hem de cesareti vardır. Farklı devlet varsa, sanal yöntemleri oluşturmak istiyorsanız, ve miras sınıfta geçersiz kılabilir. Sonra polimorfizmi dayalı, sen eğer, ve switch deyimi önleyebilirsiniz.

İkinci seçenek, sadece daha iyi bir çözüm gibi görünüyor. IMHO, ilk çözüm yöntemlerini eşlik edeceğini karşılaştırma kod çirkin çoğaltılması, örneğin, benim için show-stoper olacaktır:

public function isStateOne() {
  if(strcmp(ObjectMapper::STATE_ONE, '1') == 0) {
      return true;
  }
}
public function isStateTwo() {
  if(strcmp(ObjectMapper::STATE_TWO, '2') == 0) {
      return true;
  }
}
public function isStateThree() {
  if(strcmp(ObjectMapper::STATE_THREE, '3') == 0) {
      return true;
  }
}

Tabii ki, diğerleri katılmıyorum. Ben sadece 'hemen hemen aynı' yöntemlerle darmadağın sınıfları sahip sevmiyorum.