나는 OCP에 대해이 blog post을 통해 가고 있었고 나는 C#에서 PHP로 코드를 이식하려고했다.PHP에 C# λ 식을 이식하는 것
public class PricePerUnitStrategy
{
public bool IsMatch(OrderItem item)
{
return item.Identifier.StartsWith("Each");
}
public decimal CalculatePrice(OrderItem item)
{
return item.Quantity * 4m;
}
}
public class DefaultPriceCalculator
{
private readonly List<IPriceStrategy> _pricingRules;
public DefaultPriceCalculator()
{
_pricingRules = new List<IPriceStrategy>();
_pricingRules.Add(new PricePerKilogramStrategy());
_pricingRules.Add(new PricePerUnitStrategy());
_pricingRules.Add(new SpecialPriceStrategy());
}
public decimal CalculatePrice(OrderItem item)
{
return _pricingRules.First(r => r.IsMatch(item)).CalculatePrice(item);
}
}
이 어떻게 PHP의 람다 표현식을 사용하는 것이 바람직 PHP에 CalculatePrice
기능을 은밀한 않습니다
나는 어려움이 기능을 포팅하는 데 문제가? 여기
public function CalculatePrice(OrderItem $item){
foreach ($pricingRules as $rule) {
if ($rule->IsMatch($item)){
return $rule->CalculatePrice($item);
}
}
return null;
}
처럼 뭔가를 할 것이라고 생각
class OrderItem{
public $Identifier;
public $Quantity;
}
class PricePerUnitStrategy{
public function IsMatch(OrderItem $item){
return $item->Identifier=="Each";
}
public function CalculatePrice(OrderItem $item){
return $item->Quantity * 4;
}
}
class DefaultPriceCalculator{
private $pricingRules;
public function __construct(){
$pricingRules = array();
$pricingRules[]=new PricePerUnitStrategy();
}
public function CalculatePrice(OrderItem $item){
return $pricingRules->First(r => r.IsMatch($item))->CalculatePrice($item);
}
}
당신의 코드는'IsMatch' 메소드가 무엇인지 보여주지 않습니다. 확장 메소드입니까? – DavidG
@DavidG'IsMatch'가 어떻게 보이는지 보여주기 위해'PricePerUnitStrategy' 클래스를 추가했습니다. C# 또는 PHP 람다 식에 익숙하지 않아서 어떻게 호출되는지 잘 모르겠습니다. – Songo