Refactoring wyrzucający części niezmienne poza IFa

Posted on

W IF’ach powinniśmy robić tak mało jak to tylko możliwe, przykład:

if (HasInternalDocuments(AdditionalDocuments))
{
    AdditionalDocumentsGroup = new AdditionalDocumentsGroup(AdditionalDocuments);
}
else
{
    AdditionalDocumentsGroup = new AdditionalDocumentsGroup(new List<Document>());
}

To co mi się nie podoba jest zaznaczone poniżej na niebiesko. Jest to część która jest identyczna zarówno dla sekcji IF jak i ELSE. Dopiero kod podkreślony na czerwono jest różny w IF oraz ELSE i to jest miejsce którym powinniśmy “sterować” właśnie za pomocą instrukcji warunkowych.

Duplication inside IF statement
Duplication inside IF statement

Refactoring który wyrzuca to co jest “wspólne” poza instrukcję warunkową

IEnumerable<Document> internalDocuments;

if (HasInternalDocuments(AdditionalDocuments))
{
    internalDocuments = AdditionalDocuments;
}
else
{
    internalDocuments = new List<Document>();
}

AdditionalDocumentsGroup = new AdditionalDocumentsGroup(internalDocuments)

Jeszcze dalej można to zamienić na coś poniższego. Nie jest to już jednak istota tego refactoringu to syntactic sugar który nam daje .NET:

var internalDocuments = HasInternalDocuments(AdditionalDocuments)
    ? AdditionalDocuments
    : Enumerable.Empty<Document>();

AdditionalDocumentsGroup = new AdditionalDocumentsGroup(internalDocuments);

To jest taki minimalny przykład. Najgorsze są długie switche w których kopiowane są kilku linijkowe wyrażenia gdzie tak naprawdę wartość testowanej w switchu wartości ma tylko wpływ na jedną zmienną.

Refactoring prowadzi do dalszych usprawnień

Ten typ zmieniania kodu jest bardzo niedoceniany. Zazwyczaj nie chodzi tylko o to że zmienimy trochę kodu. BARDZO CZĘSTO prowadzi to do dalszych usprawnień, bo zauważyliśmy że:

  • inne warunki można rozpisać inaczej lub opuścić
  • kolejne duplikacje kodu można uwspólnić
  • w jakieś kawałki kodu nie wejdziemy nigdy
Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s