2016-12-20 4 views
1

Dies war meine erste MethodeWie diese Klasse/Methode aktualisieren Codemetrik

public String GetAllDocuments(string url,int pager =0) 
    { 
     if (SessionInfo.IsAdmin) 
     { 
      ReportHandler dal = new ReportHandler(); 
      var documents = dal.FetchDocumentsList(SessionInfo.ClientID, pager); 
      string documentsDataJSON = JsonConvert.SerializeObject(documents); 

      return documentsDataJSON; 
     } 
     else 
     { 
      return "Sorry!! You are not authorized to perform this action"; 
     } 
    } 

Visual Studio zeigt die folgenden Code-Metriken zu verbessern: -

Mitglied: GetAllDocuments (string, int): String
Wartbarkeit Index: 67
Zyklomatische Komplexität: 2
Klasse Kupplung: 7
Codezeilen: 7

Also, um es zu verbessern, modifizierte ich meine Methode wie folgt: -

public String GetAllDocuments(string url,int pager =0) 
    { 
      ReportHandler dal = new ReportHandler(); 
      var documents = dal.FetchDocumentsList(SessionInfo.ClientID, pager); 
      //moved the JSON Conversion to Separate class 
      string documentsDataJSON = JsonHandler<T>.ConvertToJSON(documents); 
      return documentsDataJSON; 

    } 

Aber noch es zeigt die Codemetrik als

Mitglied: GetAllDocuments (string, int) : String
Wartbarkeitsindex: 72
Cyclomatic Komplexität: 1
Klassenkopplung: 5
Codezeilen: 5

Ich kann dies nicht einreichen, außer der Maintainability Index ist 90+.

Was kann ich noch tun, um Code Metrics zu verbessern?

Außerdem bin ich für solche kleinen Dinge zu schaffen separate Methode/Klasse denken, ist es nicht Overhead

+0

Haben Sie gedacht, DI oder IoC zu verwenden? – Alex

+2

Diese Frage ist viel zu weit gefasst. Die Lösung basiert in der Regel auf einer grundlegenden Umgestaltung Ihres Klassenentwurfs, um die Klassenkopplung zu reduzieren. Wie auch immer, Sie sollten sich die Abhängigkeitsinjektion ansehen. – HimBromBeere

+0

Code-Metriken? Gib mir eine Pause ... –

Antwort

0

Wenn Sie Interesse an gerade lesen Wartbarkeit Index besser zu machen, wie diese berechnet wird: http://www.projectcodemeter.com/cost_estimation/help/GL_maintainability.htm

Sie kann sehen, dass es hauptsächlich von der Anzahl der Codezeilen abhängt.

Wenn Sie ein gutes Design wünschen, verwenden Sie keine konkreten Implementierungen, verwenden Sie einen der SOLID-Prinzipien - Dependency Inversion. Zum Beispiel, anstelle der Verwendung:

ReportHandler dal = new ReportHandler(); 

shoud Sie so etwas wie verwenden:

IReportHandler dal = reportHandlerFactory.GetReportHandler(); 
// where reportHandlerFactory is IReportHandlerFactory which is also 
// make dependency on interface but not on concrete class 

Oder noch besser ist, solche Dinge mit DI Behälter zu injizieren.

+0

Ihr Beitrag scheint sehr ansprechend für mich. Können Sie bitte weitere Details in Ihrem Beitrag über 'IReportHandler dal = reportHandlerFactory.GetReportHandler();' hinzufügen. –

+1

@ Kgn-web, habe ich meine Antwort bearbeitet. Macht es Sinn für dich? Es ist nur ein Beispiel, Sie sollten Ihren Code in Bezug auf die Prinzipien einer guten Programmierung (Muster, SOLID usw.) entwerfen. Wie andere hier empfohlen ist es von DI –

+0

Ja. Es ergibt Sinn für mich. Danke :) –

1

Sie sollten häufig die Erstellung von Objekten in einer Factory-Schnittstelle kapseln, die Sie an den Konstruktor der Klasse übergeben, die sie verwenden möchte.

So Ihre Klasse würde einen Konstruktor und Feld wie so haben:

public MyClass(IReportHandlerFactory reportHandlerFactory) 
{ 
    if (reportHandlerFactory == null) 
     throw new ArgumentNullException(nameof(reportHandlerFactory)); 

    _reportHandlerFactory = reportHandlerFactory; 
} 

private readonly IReportHandlerFactory _reportHandlerFactory; 

Dies als Dependency Injection bekannt ist, speziell Injektion Konstruktor.

Um dies effektiv zu tun, würden Sie wahrscheinlich auch eine Schnittstelle für Ihre ReportHandler Klasse erstellen möchten.Dann würde die Fabrik Schnittstelle etwas so:

public interface IReportHandlerFactory 
{ 
    IReportHandler Create(); 
} 

Und Bericht Handler-Schnittstelle wie folgt aus:

public interface IReportHandler 
{ 
    IEnumerable<Document> FetchDocumentsList(Guid clientID, int pager); 
} 

... und so weiter. Hoffentlich kommst du auf die Idee.

Sie sollten auch Ihre Methode aufgeteilt, vielleicht so etwas wie folgt aus:

public String GetAllDocuments(string url,int pager =0) 
{ 
    if (SessionInfo.IsAdmin) 
    { 
     return documentsData(_reportHandlerFactory, SessionInfo.ClientID, page); 
    } 
    else 
    { 
     return "Sorry!! You are not authorized to perform this action"; 
    } 
} 

private static String documentsData(
    IReportHandlerFactory reportHandlerFactory, 
    Guid clientID, 
    int pager) 
{ 
    IReportHandler dal = reportHandlerFactory.Create(); 

    var documents = dal.FetchDocumentsList(clientID, pager); 
    string documentsDataJSON = JsonConvert.SerializeObject(documents); 

    return documentsDataJSON; 
} 

HINWEIS: Um ehrlich zu sein, diese Frage wirklich eine bessere Passform ist für https://codereview.stackexchange.com/

ich auf die folgenden Bücher empfehlen zu diesem Thema:

Clean Code: A Handbook of Agile Software Craftsmanship (Robert C. Martin)

und

Dependency Injection in .NET (Mark Seemann)

oder Mark Seemann Blog.

+0

Wowwww. Sehr aufschlussreich für mich. Wirklich zu schätzen :) –

+0

Mattherw, alles ist klar für mich in Ihrem Beitrag. Aber ich bin mir nicht sicher, wie ich die Schnittstelle 'IReportHandlerFactory' implementieren soll –

+0

Bitte fügen Sie es zu Ihrem Beitrag hinzu. Es wird mich in einer langen Zeit führen :) –

2

Nehmen Sie einen Wartbarkeitsindex als Werkzeug, kein Ziel.

Es hat keinen Sinn, den Wartbarkeitsindex zu erhöhen, wenn Sie nicht erkennen, warum Ihr Code überhaupt nicht gewartet werden konnte. Sie werden den Code immer weiter verschieben, um den Index zu erfüllen, ohne jemals zu verstehen, was Sie tun.

Ihre Frage sollte nicht sein

Wie diese Klasse/Methode aktualisieren-Metriken zu verbessern?

aber

Wie die Wartbarkeit dieser Klasse verbessern?

Ich sehe eine Reihe von Problemen mit sich sofort:

  • Abhängigkeiten sind implizit, das heißt Sie new ‚sind Dinge ing direkt innerhalb der Methode auf. Dies macht den Code weniger flexibel, zusammensetzbar und lesbar.

    Die Übergabe der ReportHandler-Abhängigkeit an GetAllDocuments() oder den Klassenkonstruktor wäre stattdessen besser.

  • Es ist schlecht testbar. Wenn ReportHandler stattdessen eine Schnittstelle (oder eine abstrakte Klasse) wäre, könnten Sie sie in Tests für GetAllDocuments() für eine verbesserte Leistung und Tests durch einen falschen Report-Handler ersetzen. Beachten Sie, dass Sie keine Factory verwenden müssen, um dies zu tun, eine einfache Schnittstelle mit einer realen Implementierung und einer Testimplementierung sind gut genug.

  • Der Parameter url wird nicht verwendet.

  • SessionInfo.IsAdmin ist eine Art magischer Kurzschrift, die für die gleiche Reihe von Problemen wie die oben genannten anfällig ist. Wenn Sie in einem Controller sind, ist es keine große Sache, aber wenn Sie in einer Business-Schicht sein sollen, wird dies Testbarkeit und Wartbarkeit behindern.

+0

Wirklich zu schätzen Sie für die Weitergabe Ihrer Eingaben. –

+0

Können Sie bitte überprüfen Sie meine aktualisierte Snippet http://codereview.stackexchange.com/questions/150382/is-this-the-right-way-to-implement-factory-pattern –

+0

Ich wäre Ihnen sehr dankbar, wenn Sie teilen können Ihre Rezension oder die Verwendung des Snippets kann zeigen, wie ich dasselbe mithilfe der SOLID-Prinzipien implementiere –