Statik yöntemler bir sınıf için Too Many olduğunu Kaç?

6 Cevap php

UPDATE: sormak için soru Rephrasing, bu sınıf yapısı statik yöntemleri (şu anda sadece 4 var ama ben aslında 2 ile başladı fark) 'çok var'? Eğer öyleyse, ben model sınıflardan statik işlevleri kaldırmak böylece Finder sınıfın çeşit kullanmak için bu sınıfları refactor konusunda herhangi bir öneriniz?

Ben şu soyut sınıf vardır:

abstract class LP_Model_Abstract
{
protected static $_collectionClass = 'LP_Model_Collection';

protected $_row = null;

protected $_data = array();

public function __construct($row = null)
{
	$this->_row = $row;
}

public function __get($key)
{
	if(method_exists($this, '_get' . ucfirst($key)))
	{
		$method = '_get' . ucfirst($key);
		return $this->$method();			
	}
	elseif(isset($this->_row->$key))
	{
		return $this->_row->$key;
	}
	else
	{
		foreach($this->_data as $gateway)
		{
			if(isset($gateway->$key))
			{
				return $gateway->$key;
			}
		}
	}	
}

public function __set($key, $val)
{
	if(method_exists($this, '_set' . ucfirst($key)))
	{
		$method = '_set' . ucfirst($key);
		return $this->$method($val);			
	}
	elseif(isset($this->_row->$key))
	{
		$this->_row->$key = $val;
		return $this->_row->$key;
	}
	else
	{
		foreach($this->_data as $gateway)
		{
			if(isset($this->_data[$gateway]->$key))
			{
				$this->_data[$gateway]->$key = $val;
				return $this->_data[$gateway]->$key;
			}
		}
	}
}

public function __isset($key)
{
	return isset($this->_row->$key);
}

public function save()
{
	$this->_row->save();
}

abstract public static function get($params);
abstract public static function getCollection($params = null);
abstract public static function create($params);

}

Ve sonra sınıf tablo miras programları (tip bir fabrika moda ek işlevsellik belirlemede önemli olduğu) için ek işlevsellik sağlar bu sınıf:

abstract class LP_Model_Factory_Abstract extends LP_Model_Abstract
{
    protected static $_collectionClass = 'LP_Model_Collection_Factory';

    abstract public static function factory($row);
}

Bu sonuçta sınıf bildirimi aşağıdaki türü neden:

class Model_Artifact extends LP_Model_Factory_Abstract
{
    protected static $_artifactGateway = 'Model_Table_Artifact';

    public static function create($params)
    {

    }

    public static function get($params) 
    {
    	$gateway = new self::$_artifactGateway();

    	$row = $gateway->fetchArtifact($params);

    	return self::factory($row);        
    }

    public static function getCollection($params = null) 
    {
    	$gateway = new self::$_artifactGateway();

    	$rowset = $gateway->fetchArtifacts($params);

    	$data = array(
    		'data' => $rowset,
    		'modelClass' => __CLASS__
    	);

    	return new self::$_collectionClass($data);
    }

    public static function factory($row)
    {
    	$class = 'Model_Artifact_' . $row->fileType;
    }
}

Ne zaman bir sınıfta çok fazla statik yöntemleri olduğunu biliyor musunuz? Ve statik yöntemler belki Finder sınıf çeşit kapsüllü böylece nasıl mevcut tasarım refactor istiyorsunuz?

6 Cevap

Şahsen ben statik yöntemler herhangi bir sayıda sorun bir işareti olduğunu bulmak. Sınıf örneği yöntemleri ve statik yöntemler varsa, o zaman büyük olasılıkla iki ayrı varlık haline sınıfını bölmek ve örnek yöntemleri statik yöntemleri değişebilir.

Doğası gereği küreseldir farklı özelliği ile, nesnenin özel bir tür olarak bir sınıf düşünün. Küresel bir değişken olduğu için, bu kavrama çok güçlü bir seviyeye gelir, bu nedenle tüm başvuruları azaltmak isterim. Statik üyeler kod sınıfına bağlantı güçlü bir düzeyde alacak, yani sevk edilmesi gerekir.

Ben Brubaker katılıyorum ve dedi yöntemleri işlevsellik olarak çok yöntemlerin sayısı değildir benim düşünce eklemek olurdu. Eğer sınıf, birçok yöntemler (statik veya başka türlü) için olduğunu düşünmeye başlarsanız o zaman onlar yeniden gruplandırılmış ve daha sezgisel bir mimarisi içine refactored bulabilirsiniz.

Yöntemler işlevselliği vatansız olup olmadığını belirlerken birçok statik yöntemler varsa kullandığım ilk göstergesidir. Statik yöntemler de ikamet nesnenin durumunu değiştirmek, bunlar muhtemelen statik olmamalıdır.

Ben BaileyP katılıyorum ve ben peni benim birkaç ekleyeceğiz:

Ben her zaman bir sınıf mevcut için tek bir neden olması gerektiğini fikri ile çalışmak; o öyle bir iş olmalı, ve bunu iyi yapmak gerekir. Bu karar, ve bu sınıfa arayüz ne olması gerektiğini bulmaktan sonra, ben geçmesi ve statik sınıfının bir örneğinin durumunu değiştirmek gerekmez herhangi bir fonksiyonu işaretleyin.

Eğer yeniden ve sınanabilir kod oluşturmak istiyorsanız, yapmanız gerekir avoid static methods altogether. Statik yöntemleri (veya non-veri-gibi sınıfların kurucular) çağırır kod izolasyon test edilemez.

Evet, statik yöntemleri ortadan kaldırmak, daha fazla nesneler sürü etrafında geçmek zorunda olacaktır. Bu mutlaka kötü bir şey değil. Bu disiplinli bir şekilde bileşenler arasındaki sınırları ve işbirliği düşünmeye zorlar.

Benim 2 sent veririm.

Her şeyden önce, ben keyfi sınırı çeşit ayarı gibi, yararlı olmadığını kabul edeceğiz "Ben çok fazla olan bir sınıfta 10'dan fazla statiği kere!". Mantıklı zaman Refactor ancak bazı hayali sınır isabet ettik, çünkü sadece bunu yapmaya başlayabilirsiniz yok.

Ben% 100 vatansız durumsal vs hakkında Brubaker yorumuna katılıyorum ediyorum - Ben sorunu örnekleri vs sınıfları hakkında daha fazla olduğunu düşünüyorum. Bir statik yöntem durumsal değişiklik başka bir statik özelliğinin değerini değiştirebilirsiniz çünkü.

Yani, bu gibi düşünüyorum - yöntemi / özellik veya ilgili durumda olması halinde class, o zaman muhtemelen statik olmalıdır. Yöntem / özellik taşımaktadır ya da bir instance sınıfı ile ilgili, bu statik olmamalıdır.