このクラスがあると想像してください
class Ai1ec_Less_Parser_Controller {
/**
* @var Ai1ec_Read_Variables_Startegy
*/
private $read_variable_strategy;
/**
* @var Ai1ec_Save_Variables_Strategy
*/
private $write_variable_strategy;
/**
* @var Ai1ec_Less_Variables_Collection
*/
private $less_variables_collection;
/**
* @var Ai1ec_Less_Parser
*/
private $ai1ec_less_parser;
/**
* We set the private variables in the constructor. I feel that there are too many parameters.
* Should i use setter instead and throw an exception if something is not set?
*
* @param Ai1ec_Read_Variables_Startegy $read_variable_strategy
* @param Ai1ec_Save_Variables_Strategy $write_variable_strategy
* @param Ai1ec_Less_Variables_Collection $less_variables_collection
* @param Ai1ec_Less_Parser $ai1ec_less_parser
*/
public function __construct( Ai1ec_Read_Variables_Startegy $read_variable_strategy,
Ai1ec_Save_Variables_Strategy $write_variable_strategy,
Ai1ec_Less_Variables_Collection $less_variables_collection,
Ai1ec_Less_Parser $ai1ec_less_parser ) {
}
}
これらの変数を設定する必要があるため、コンストラクターで設定します (ただし、パラメーターが多すぎるように見えます)。別のオプションは、セッターを使用してそれらを設定し、必要な変数の1つがこのように設定されていない場合、メソッドで例外をスローすることです
public function do_something_with_parser_and_read_strategy() {
if( $this->are_paser_and_read_strategy_set === false ) {
throw new Exception( "You must set them!" );
}
}
private function are_paser_and_read_strategy_set () {
return isset( $this->read_variable_strategy ) && isset( $this->ai1ec_less_parser );
}
2 つの方法のどちらかが優れていると思いますか?その理由は?