2012-08-07 92 views
0

在我的代碼中我有3個部分,但在3個部分中的2個代碼幾乎完全相同,我想知道是否有人可以幫助我正確地構造它們,以便我只需要一行寫入一行,在一個範圍內,以便它可以被兩個部分看到,所以我不需要有太多的代碼。 (框架3.5)C# - 範圍混亂

public static void FakeDriveInfo() 
{ 
    List<DriveInfo> driveList = DriveInfo.GetDrives().Where(x => x.IsReady).ToList<DriveInfo>(); 

    Server server = new Server(); 

    Console.WriteLine(); 
    Console.ForegroundColor = ConsoleColor.White; 
    Console.WriteLine("Server ID :  {0}", server.ServerID = 0); 
    Console.WriteLine("Server Name : {0}", server.ServerName = string.Concat(System.Environment.MachineName)); 
    Console.WriteLine(); 

    for (int i = 0; i < driveList.Count; i++) 
    { 
     ServerDrive serverDrives = new ServerDrive(); 

     Console.WriteLine("Drive Letter: {0}", driveList[i].Name); 
     Console.WriteLine("Total Size:  {0}", FormatBytes(driveList[i].TotalSize)); 
     Console.WriteLine("Volume Label: {0}", driveList[i].VolumeLabel); 
     Console.WriteLine("Free Space:  {0}", FormatBytes(driveList[i].TotalFreeSpace)); 
     Console.WriteLine("Drive Format: {0}", driveList[i].DriveFormat); 
     Console.ReadLine(); 
    } 
} 

public static void RealDriveInfo() 
{ 
    //Create the server object - You will need create a list of the server objects. 
    Server server = new Server(); 

    //Get all drives information 
    List<DriveInfo> driveList = DriveInfo.GetDrives().Where(x => x.IsReady).ToList<DriveInfo>(); 

    //Insert information of one server - You will need get information of all servers 
    server.ServerID = 0; //Here is necessery put PK key. I recommend doing the SQL server will automatically generate the PK. 
    server.ServerName = string.Concat(System.Environment.MachineName); 

    //Inserts information in the newServers object 
    for (int i = 0; i < driveList.Count; i++) 
    { 
     ServerDrive serverDrives = new ServerDrive(); 

     //Put here all the information to obeject Server     
     serverDrives.DriveLetter = driveList[i].Name; 
     serverDrives.TotalSpace = driveList[i].TotalSize; 
     serverDrives.DriveLabel = driveList[i].VolumeLabel; 
     serverDrives.FreeSpace = driveList[i].TotalFreeSpace; 
     serverDrives.DriveType = driveList[i].DriveFormat; 

     //  server.ListServerDrives.Add(serverDrives); 
     server.ServerDrives.Add(serverDrives); 
    } 

    //Add the information to an SQL Database using Linq. 
    DataClasses1DataContext db = new DataClasses1DataContext(@"sqlserver"); 
    // db.Servers.InsertAllOnSubmit(server); 
    db.Servers.InsertOnSubmit(server); 
    db.SubmitChanges(); 
} 

我想要做的是移動SQL到LINQ部分的代碼的底部到它自己的部分。但要做到這一點我必須有全科RealDriveInfo太..

,我要做的就是讓List<DriveInfo> driveList = DriveInfo.GetDrives().Where(x=>x.IsReady).ToList<DriveInfo>();,以便它可以通過FakeDriveInfo和RealDriveInfo可以看到另一部分..

任何反饋會非常感謝,謝謝。

編輯:此刻我打電話給兩個方法, FakeDriveInfo(); =執行控制檯應用程序並向我顯示它要提交的信息。 名稱,字母,標籤,服務器名稱,ID等 RealDriveInfo(); =連接到SQL Server並將信息插入到兩個表中。

我想要第三種方法 WriteInToDB(); =數據庫寫入代碼將從RealDriveInfo方法獲取並移至此處。

目前我有兩種方法,實際上看起來是相同的,由於範圍。 我希望移動的範圍,以便我可以將代碼的列表部分放入Main()方法中,FakeDriveInfo和RealDriveInfo都可以使用它,而不是代碼重複。

希望這增加了更多的意義,這一切:)

+3

如果它沒有損壞,不要修復它。 – 2012-08-07 13:06:20

+3

你的代碼對我來說似乎很好。不要過分強調這樣的事情。 – Filip 2012-08-07 13:08:45

+1

FakeDriveInfo內的'serverDrives'有什麼意義?我不同意上面的兩條評論。 – JonH 2012-08-07 13:12:36

回答

0

疼痛stakeingly實現後,得到的答覆是方法和類的範圍..

只是櫃面任何人希望看到簡單地通過移動我做了什麼::

public class Program 
{ 
    List<DriveInfo> driveList = DriveInfo.GetDrives().Where(x => x.IsReady).ToList<DriveInfo>(); //Get all the drive info 
    Server server = new Server(); //Create the server object 
    ServerDrive serverDrives = new ServerDrive(); 

    public void Main() 
    { 
     Program c = new Program(); 
     c.FakeDriveInfo(); 
     c.RealDriveInfo(); 
     c.WriteInToDB(); 
    } 

    public static string FormatBytes(long bytes) 
    { 
     const int scale = 1024; 
     string[] orders = new string[] { "GB", "MB", "KB", "Bytes" }; 
     long max = (long)Math.Pow(scale, orders.Length - 1); 
     foreach (string order in orders) 
     { 
      if (bytes > max) 
      { 
       return string.Format("{0:##.##} {1}", Decimal.Divide(bytes, max), order); 
      } 

      max /= scale; 
     } 
     return "0 Bytes"; 
    } 

    public void FakeDriveInfo() 
     { 

      Console.WriteLine(); 
      Console.ForegroundColor = ConsoleColor.White; 
      Console.WriteLine("Server ID :  {0}", server.ServerID = 0); 
      Console.WriteLine("Server Name : {0}", server.ServerName = string.Concat(System.Environment.MachineName)); 
      Console.WriteLine(); 


      for (int i = 0; i < driveList.Count; i++) 
      { 

       Console.WriteLine("Drive Letter: {0}", driveList[i].Name); 
       Console.WriteLine("Total Size:  {0}", FormatBytes(driveList[i].TotalSize)); 
       Console.WriteLine("Volume Label: {0}", driveList[i].VolumeLabel); 
       Console.WriteLine("Free Space:  {0}", FormatBytes(driveList[i].TotalFreeSpace)); 
       Console.WriteLine("Drive Format: {0}", driveList[i].DriveFormat); 
       Console.ReadLine(); 
      } 
     } 

    public void RealDriveInfo() 
     { 


      //Insert information of one server - You will need get information of all servers 
      server.ServerID = 0; //Here is necessery put PK key. I recommend doing the SQL server will automatically generate the PK. 
      server.ServerName = string.Concat(System.Environment.MachineName); 

      //Inserts information in the newServers object 
      for (int i = 0; i < driveList.Count; i++) 
      { 

       //Put here all the information to obeject Server     
       serverDrives.DriveLetter = driveList[i].Name; 
       serverDrives.TotalSpace = driveList[i].TotalSize; 
       serverDrives.DriveLabel = driveList[i].VolumeLabel; 
       serverDrives.FreeSpace = driveList[i].TotalFreeSpace; 
       serverDrives.DriveType = driveList[i].DriveFormat; 
       server.ServerDrives.Add(serverDrives); 

      } 
     } 

    public void WriteInToDB() 
    { 
     //Add the information to an SQL Database using Linq. 
     DataClasses1DataContext db = new DataClasses1DataContext(@"cspsqldev"); 
     // db.Servers.InsertAllOnSubmit(server); 
     db.Servers.InsertOnSubmit(server); 
     db.SubmitChanges(); 
    } 

我希望被所有方法看到的部分放到它現在工作的類範圍中。

感謝您的反饋球員:)

1

我希望我正確捕獲你的功能。 3個地區,創造,輸出,堅持。你可以通過每個部分來創建可重用的方法。您可以將輸出部分移動到ServerToString()方法。

 #region create graph 

     var server = new Server() 
     { 
      ServerID = 0, 
      ServerName = string.Concat(Environment.MachineName), 
      ServerDrives = DriveInfo.GetDrives() 
            .Where(x => x.IsReady) 
            .Select(di => new ServerDrive() 
            { 
             DriveLetter = di.Name, 
             TotalSpace = di.TotalSize, 
             DriveLabel = di.VolumeLabel, 
             FreeSpace = di.TotalFreeSpace, 
             DriveType = di.DriveFormat 
            }) 
            .ToList() 
     }; 

     #endregion 

     #region output graph 

     Console.WriteLine(); 
     Console.ForegroundColor = ConsoleColor.White; 
     Console.WriteLine("Server ID :  {0}", server.ServerID); 
     Console.WriteLine("Server Name : {0}", server.ServerName); 
     Console.WriteLine(); 

     server.ServerDrives.ForEach(sd => 
     { 
      Console.WriteLine("Drive Letter: {0}", sd.DriveLetter); 
      Console.WriteLine("Total Size:  {0}", sd.TotalSpace); 
      Console.WriteLine("Volume Label: {0}", sd.DriveLabel); 
      Console.WriteLine("Free Space:  {0}", sd.FreeSpace); 
      Console.WriteLine("Drive Format: {0}", sd.DriveType); 
      Console.ReadLine(); 
     }); 

     #endregion 

     #region persist graph 

     DataClasses1DataContext db = new DataClasses1DataContext(@"sqlserver"); 
     db.Servers.InsertOnSubmit(server); 
     db.SubmitChanges(); 

     #endregion 
2

創建方法:

public static List<DriveInfo> GetDrives { 
    return DriveInfo.GetDrives().Where(x => x.IsReady).ToList<DriveInfo>(); 
} 

說它在這兩個地方:

public static void FakeDriveInfo() 
{ 
    List<DriveInfo> driveList = GetDrives(); 
    // ... 
} 

public static void RealDriveInfo() 
{ 
    List<DriveInfo> driveList = GetDrives(); 
    // .... 
} 

這是基本的重構一個。它被稱爲提取方法並已被Martin Fowler over here描述。

1

我已經採取了創建一種新方法的方法,ProcessDriveInfo,它由您的兩個原始方法調用。這兩種方法獲取驅動器列表,創建服務器,對服務器執行某些操作,併爲每個驅動器做了一些操作。我將前兩步移到ProcessDriveInfo,並通過了最後兩步的操作。

第一個操作(即方法)對服務器執行某些操作,而第二個操作對單個操作執行某些操作(如driveInfo)。

n.b.我已經「回答」了這個問題,因爲它消除了重複,但可以說它的可讀性較差。

public Server ProcessDriveInfo(Action<Server> initialAction, Action<Server, DriveInfo> driveInfoAction) 
    { 
     var driveList = DriveInfo.GetDrives().Where(x => x.IsReady).ToList(); 
     var server = new Server(); 

     initialAction(server); 
     driveList.ForEach(dl => driveInfoAction(server, dl)); 

     return server; 
    } 

    public void FakeDriveInfo() 
    { 
     ProcessDriveInfo(WriteServerToConsole, WriteDriveInfoToConsole); 
    } 

    private void WriteServerToConsole(Server server) 
    { 
     Console.WriteLine(); 
     Console.ForegroundColor = ConsoleColor.White; 
     Console.WriteLine("Server ID :  {0}", server.ServerID = 0); 
     Console.WriteLine("Server Name : {0}", server.ServerName = string.Concat(System.Environment.MachineName)); 
     Console.WriteLine(); 
    } 

    private void WriteDriveInfoToConsole(Server server, DriveInfo t) 
    { 
     Console.WriteLine("Drive Letter: {0}", t.Name); 
     Console.WriteLine("Total Size:  {0}", FormatBytes(t.TotalSize)); 
     Console.WriteLine("Volume Label: {0}", t.VolumeLabel); 
     Console.WriteLine("Free Space:  {0}", FormatBytes(t.TotalFreeSpace)); 
     Console.WriteLine("Drive Format: {0}", t.DriveFormat); 
     Console.ReadLine(); 
    } 

    public void RealDriveInfo() 
    { 
     var server = ProcessDriveInfo(InitialiseServer, WriteDriveInfoToServer); 

     //Add the information to an SQL Database using Linq. 
     var db = new DataClasses1DataContext(@"sqlserver"); 
     // db.Servers.InsertAllOnSubmit(server); 
     db.Servers.InsertOnSubmit(server); 
     db.SubmitChanges(); 
    } 

    private static void InitialiseServer(Server server) 
    { 
     // Insert information of one server - You will need get information of all servers 
     server.ServerID = 0; 
     // Here is necessery put PK key. I recommend doing the SQL server will automatically generate the PK. 
     server.ServerName = Environment.MachineName; 
    } 

    private static void WriteDriveInfoToServer(Server server, DriveInfo t) 
    { 
     var serverDrives = new ServerDrive 
           { 
            DriveLetter = t.Name, 
            TotalSpace = t.TotalSize, 
            DriveLabel = t.VolumeLabel, 
            FreeSpace = t.TotalFreeSpace, 
            DriveType = t.DriveFormat 
           }; 

     server.ServerDrives.Add(serverDrives); 
    }