次のコードをリファクタリングしたいのですが、どのように通知ハンドラを挿入しますか?必要に応じて最小限のオリジナルコード変更と最適なリファクタリング私はすでに以下のようにそれをリファクタリングしているこのC#コードを最適にリファクタリングするにはどうすればよいですか?
public class TestEventHandlers
{
public TestEventHandlers() { }
public void OpenMarket(Page page)
{
var Id = page.Request["MarketId"];
var repository = new EntityRepository();
IEntity market = repository.GetById(Id);
if (market.State != "Open")
{
throw new Exception("The market is not open!");
}
else
{
market.Open();
repository.SaveChangesTo(market);
var smtpClient = new SmtpClient();
var message = new MailMessage();
message.Subject = "market open";
message.Body = market.ToString() + " was open.";
message.To.Add(new MailAddress("[email protected]"));
smtpClient.Send(message);
}
}
public void CloseMarket(Page page)
{
var Id = page.Request["MarketId"];
var repository = new EntityRepository();
IEntity market = repository.GetById(Id);
if (market.State == "Close")
{
throw new Exception("The market is already close!");
}
else
{
market.Close();
repository.SaveChangesTo(market);
var smtpClient = new SmtpClient();
var message = new MailMessage();
message.Subject = "market closed";
message.Body = market.ToString() + " has been closed.";
message.To.Add(new MailAddress("[email protected]"));
smtpClient.Send(message);
}
}
}
-
public class TestEventHandlers
{
public TestEventHandlers() { }
public void OpenMarket(Page page)
{
var Id = page.Request["MarketId"];
if (id!=null)
{
var repository = new EntityRepository();
IEntity market = repository.GetById(Id);
if (market.State != "Open")
{
throw new Exception("The market is not open!");
}
else
{
market.Open();
repository.SaveChangesTo(market);
SendEmailNotification("market open", market.ToString() + " was open.", "[email protected]");
}
}
else
{
throw new Exception("Id can not be null");
}
}
private static void SendEmailNotification(string subject,string body,string emailAddress)
{
var smtpClient = new SmtpClient();
var message = new MailMessage();
message.Subject = subject;
message.Body = body;
message.To.Add(new MailAddress(emailAddress));
smtpClient.Send(message);
}
public void CloseMarket(Page page)
{
var Id = page.Request["MarketId"];
if(id!=null)
{
var repository = new EntityRepository();
IEntity market = repository.GetById(Id);
if (market.State == "Close")
{
throw new Exception("The market is already close!");
}
else
{
market.Close();
repository.SaveChangesTo(market);
SendEmailNotification("market closed", market.ToString() + " has been closed.", "[email protected]");
}
}
else
{
throw new Exception("Id can not be null");
}
}
}
あなたは 'CloseMarket'と' OpenMarket'をマージしたいかもしれません。その状態を「閉じる」または「開く」に変更するだけです。パラメータは2つのメソッドを1に減らします。 – Badiparmagi
私はBadipamagiの提案に行きます。また、ヌルチェックも追加してください。 SendNotificationでも同じ新しいパラメータを使用できます。また、他の場所に通知を送信しない場合は、それをマージすることもテストポイントから行うこともできますし、懸念の分離を維持するためにそのまま放置することもできます。 –
もヌルチェックを追加しましたが、それは他のクラスやメソッドに巨大なリファクタリングを行うので、1つのメソッドとして作るのは良い考えではありません。つまり、 'OpenMarket(Page page) とCloseMarket(Pageページ)' – Neo