Kodlama standartları: argümanların büyük miktarda

6 Cevap php

Hey, ben üniversite mezunu dışarı taze değilim. Beklediğim bir proje üzerinde çalışıyorum sonuçta başkası tarafından muhafaza edilecektir. Ben bu proje üzerinde rahatsız edici bir durumla karşılaşmak tutmak, ve birçok özel değişkenleri gerektiren ve sonucu çok uzun kurucular gibi nesneler.

Apart değişken adlandırma, zorunlu herhangi bir kodlama standardı yoktur. Ben bu seviyor ile nasıl başa çıkılacağı merak ediyorum. Bazen gelecekte dailywtf benim kendi bazı kod göreceksiniz korku!

Ben başka sınıflara bu argümanlar içine bazı çalışıyorum hakkında öğretilen, ancak bu durumda gerçekten mantıklı değil.

Bu toplam olmayan bir konudur yoksa olması gerektiği bir şeydir ve kolayca düzeltilebilir?

public function __construct($uCode = '', $uName = '', $uTime = '', $uArea = '', $uDomain = '', $uText = '', $uId = '', $uNum = '', $uVideo = 0, $uAudio = 0, $uImage = 0){

6 Cevap

Yaklaşık 4 argümanlar daha varsa genellikle konuşan, geçici bir nesne veya dizi kullanarak yerine daha kapalı. Genellikle parametrelerin çoğunu isteğe bağlı ve bu oldukça hızlı eğilimli oldukça garip ve hata alabilirsiniz çünkü. Yani:

class MyClass {
  public function __construct($options) { ... }
...
}

$o = new MyClass(array(
  'uCode' => 'some value',
  'uText' => 'another value',
));

Ile karşılaştırın:

$o = new MyClass('some value', '', '', '', '', 'another value');

Dizi versiyonu sadece geçmek istediğiniz ne içerir nasıl fark.

Ben Cletus'un çözüm yolunda yalın eğilimindedir, ancak diğer alternatif kurucusuna sahip olmak kesinlikle gerekli olmayan değerleri için set () fonksiyonları kullanmaktır.

$ uCode ve $ uname gerekiyorsa, örneğin, ama kalanı isteğe bağlıdır ...

public function __construct($uCode = '', $uName = '') {}
public function setUTime($uTime) {}
public function setUArea($uArea) {}
...

Bu bazen belirleyiciler $ this dönmek için yararlı olabilir, böylece zincir komutları can, şöyle:

$object = new MyObject($code, $name);
$object->setUTime($time)->setUArea($area)->...;

Burada .. oluşturucu deseni kullanın

http://en.wikipedia.org/wiki/Builder_pattern

Eğer çok fazla argüman varsa, bu yöntem çok fazla yapıyor olabilir bir işaretidir. Birçok küçük görevleri içine görevi kırmak ve yöntemi refactor eğer deneyin. Bu başarısız olursa, tüm parametreleri ile bir sınıfta geçen ince olmalıdır.

Sen bir diziye birçok parametre atamak ve sadece bir dizi parametresi olabilir böylece __ yerine oluşturmak için bu diziyi iletebilirsiniz.

Eğer büyü yöntemleri kullanabilirsiniz

class abc {

    private $allowed = array(
    	'uCode',
    	'uId'
    );

    public function __set($name, $value) {
    	if (in_array($name, $this->allowed)) {
    		$this->$name = $value;
    	}
    }

    public function __call($name, $args) {
    	if (substr($name, 0, 4) == "set_") {
    		$var = substr($name, 4);
    		if (in_array($var, $this->allowed)) {
    			$this->$var = $args[0];
    		}
    	}
    }

}

$abc = abc();
$abc->uCode = 123;
$abc->set_uId(123);