Refactoring: expose static method

You may discover sometimes that some of your classes have method you would like to use without creating new instance of that class. In this case we have to use expose static method refactoring to make this method static.

Let’s say you have class called MailValidator that  validates your e-mail objects so your system sends out only messages that follow the set of custom business rules. One of the methods is called IsValidAddress. The code of IsValidAddress method is borrowed from The Code Project article Effective Email Address Validation.

public class MailValidator
{
   
private Mail
_mail;

   
public MailValidator(Mail
mail)
    {
        _mail = mail;
    }

   
// Block of other validation rules

   
private bool
IsValidAddress()
    {
       
string strRegex = @"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}"
+
           
@"\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\"
+
           
@".)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$"
;
       
Regex re = new Regex
(strRegex);
       
return re.IsMatch(_mail.To);
    }
}

IsValidAddress is the method we are interested in. All the other validation rules in this class are very specific to those e-mails and we are not interested in those rules at more common level. But we want to use IsValidAddress method on some other parts of our system to validate e-mail addresses. Let’s suppose we have to validate e-mail addresses that users insert when they are joining with our site. In this case we don’t have e-mail object – we just want to make sure that user inserted correct e-mail address.

What we have to do is to refactor IsValidAddress method. We have to follow these steps:

  1. make IsValidAddress method publicly visible,
  2. make IsValidAddress static,
  3. add new parameter emailAddress to its signature,
  4. resolve the dependence of e-mail object.

As a result our MailValidator looks like this.

public class MailValidator
{
   
private Mail
_mail;

   
public MailValidator(Mail
mail)
    {
        _mail = mail;
    }

   
// Block of other validation rules

   
public static bool IsValidAddress(string
emailAddress)
    {
       
string strRegex = @"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}"
+
           
@"\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\"
+
           
@".)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$"
;
       
Regex re = new Regex
(strRegex);
       
return re.IsMatch(emailAddress);
    }
}

Now we can use IsValidAddress method without instantiating the new instance of MailValidator class. Let’s say we have form called join.aspx and we have textbox emailTextBox defined on it. Also let there be button called joinButton. When user presses joinButton we want to validate form fields and one of these fields is e-mail address.

protected void joinButton_Click(object sender, EventArgs e) 
{
   
// ...

   
if(!MailValidator
.IsValidAddress(emailTextBox.Text))
    {
        SetError(
"email", "E-mail address is not valid!"
);
       
return
;
    }

   
// ...
}

Now we can use MailValidator class to validate e-mail addresses everywhere we need in our system. And if there are more common methods besides IsValidAddress we can make those methods visible same way.

As a last thing be warned that using static methods heavily is not a good idea because you will loose many of the object-oriented programming advantages this way. You can read more about static methods from developer Fusion article A Twisted Look at Object Oriented Programming in C#.

Gunnar Peipman

Gunnar Peipman is ASP.NET, Azure and SharePoint fan, Estonian Microsoft user group leader, blogger, conference speaker, teacher, and tech maniac. Since 2008 he is Microsoft MVP specialized on ASP.NET.

    Leave a Reply

    Your email address will not be published. Required fields are marked *