Visual Studio 2015 cung cấp khả năng tái cấu trúc / đổi tên mã rất lớn. Nó giúp nhà phát triển tối ưu hóa và cấu trúc lại mã theo sự phát triển hoặc thực tiễn tốt nhất cần thiết. Tính năng này cho phép nhà phát triển thực hiện theo các thực tiễn tốt nhất bằng cách đưa ra các đề xuất tái cấu trúc và giúp sửa lỗi và tối ưu hóa mã. Đổi tên các biến, phương thức, thuộc tính, lớp hoặc thậm chí các dự án luôn là một thách thức đối với các nhà phát triển khi làm việc trên một cơ sở mã lớn. Một thách thức khác mà hầu hết các nhà phát triển phải đối mặt là nhận xét mã wrt và viết một phương thức tối ưu hóa. Visual Studio 2015 giúp tái cấu trúc mã và đổi tên cũng theo cách rất dễ dàng và thân thiện.

Đổi tên mã

Có rất nhiều tính năng mà khả năng đổi tên trang bìa này trong Visual Studio 2015. Thay đổi cửa sổ xem trước, đổi tên nội tuyến và không chế độ, đổi tên nhanh chóng, phát hiện và giải quyết xung đột, đổi tên nhận xét mã là một vài trong số đó. Hãy để chúng tôi thảo luận chi tiết từng người thông qua các ví dụ thực tế.

Tôi đang sử dụng phiên bản Visual Studio 2015 Enterprise và đã tạo ra một ứng dụng giao diện điều khiển có tên VS2015ConsoleApplicationgiao diện được đặt tên IProductsvà một lớp có tên MyProductsthực hiện giao diện. IProductschứa hai phương thức, một để trả về sản phẩm dựa trên mã sản phẩm và một phương thức khác để trả về danh sách đầy đủ các sản phẩm. Product.cs là một lớp khác chứa Productthực thể. Lớp này hoạt động như một đối tượng chuyển giao hoặc thực thể. Chúng ta sẽ sử dụng Mainphương thức của lớp Program.cs để gọi các phương thức của MyProductslớp.

Sản phẩm 

1: using System;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.Text;
5: using System.Threading.Tasks;
6:
7: namespace VS2015ConsoleApplication
8: {
9: interface IProducts
10:
    {
11:    Product GetProduct(string productCode);
12:    List<product> GetProductList();
13: }
14: }

 Sản phẩm

 1: using System;
 2: using System.Collections.Generic;
 3: using System.Linq;
 4: using System.Text;
 5: using System.Threading.Tasks;
 6:
 7: namespace VS2015ConsoleApplication
 8: {
 9:     public class Product
10:     {
11:         public string ProductName { get; set; }
12:         public string ProductCode { get; set; }
13:         public string ProductPrice { get; set; }
14:         public string ProductType { get; set; }
15:         public string ProductDescription { get; set; }
16:
17:     }
18: }

Sản phẩm của tôi

 1: using System;
 2: using System.Collections.Generic;
 3: using System.Linq;
 4: using System.Text;
 5: using System.Threading.Tasks;
 6:
 7: namespace VS2015ConsoleApplication
 8: {
 9:     public class MyProducts :IProducts
10:     {
11:         List<product> _productList = new List<product>();
12:         public MyProducts()
13:         {
14:             _productList.Add(new Product {ProductCode="0001",ProductName="IPhone",
        ProductPrice="60000",ProductType="Phone",ProductDescription="Apple IPhone" } );
15:             _productList.Add(new Product { ProductCode = "0002", ProductName = "Canvas",
        ProductPrice = "20000", ProductType = "Phone", ProductDescription = "Micromax phone" });
16:             _productList.Add(new Product { ProductCode = "0003", ProductName = "IPad",
        ProductPrice = "30000", ProductType = "Tab", ProductDescription = "Apple IPad" });
17:             _productList.Add(new Product { ProductCode = "0004", ProductName = "Nexus",
        ProductPrice = "30000", ProductType = "Phone", ProductDescription = "Google Phone" });
18:             _productList.Add(new Product { ProductCode = "0005", ProductName = "S6",
        ProductPrice = "40000", ProductType = "Phone", ProductDescription = "Samsung phone" });
19:
20:         }
21:
22:         public Product GetProduct(string productCode)
23:         {
24:             return _productList.Find(p => p.ProductCode == productCode);
25:         }
26:
27:         public List<product> GetProductList()
28:         {
29:             return _productList;
30:         }
31:     }
32: }

Chương trình.cs

 1: using System;
 2: using System.Collections.Generic;
 3: using System.Linq;
 4: using System.Text;
 5: using System.Threading.Tasks;
 6:
 7: namespace VS2015ConsoleApplication
 8: {
 9:     class Program
10:     {
11:         static void Main()
12:         {
13:             var myProducts = new MyProducts();
14:             Console.WriteLine( String.Format("Product with code 0002 is : {0}",
                  myProducts.GetProduct("0002").ProductName));
15:             Console.WriteLine(Environment.NewLine);
16:             var productList = myProducts.GetProductList();
17:             Console.WriteLine("Following are all the products");
18:
19:             foreach (var product in productList)
20:             {
21:                 Console.WriteLine(product.ProductName);
22:             }
23:             Console.ReadLine();
24:         }
25:     }
26: }

Mã của chúng tôi đã sẵn sàng. Phương thức chính của tệp Program.cs gọi cả hai phương thức giao diện từ MyProductslớp để kiểm tra chức năng.

Chúng tôi sẽ sử dụng cơ sở mã này để tìm hiểu các tính năng đổi tên mã. Kinh nghiệm đổi tên có thể thay đổi hoạt động thực tế đang được thực hiện. Ví dụ, trong MyProductslớp, chúng tôi đang sử dụng _productListnhư một biến chứa danh sách tất cả các sản phẩm và biến này được sử dụng rộng rãi trong toàn lớp.






Chúng ta hãy thử đổi tên biến này thành một tên mới được gọi _allProducts.













Lưu ý rằng ngay khi _productsListđược đổi thành _allProduct, một hộp chấm được hiển thị xung quanh tên biến đã thay đổi và biểu tượng bóng đèn xuất hiện ở bên trái. Người ta có thể thấy một thay đổi nữa, đó là tất cả các trường hợp _productListđược sử dụng đều có một dòng màu đỏ bên dưới chúng. Điều này có nghĩa là tất cả các trường hợp nên được thay đổi cho phù hợp. Bạn có thể thấy ở đây sức mạnh của Visual Studio. Visual Studio đủ thông minh để hiểu và truyền đạt rằng sự thay đổi mà nhà phát triển đang thực hiện cũng phải được phản ánh ở những nơi khác. Hãy cho chúng tôi xem những gì biểu tượng bóng đèn nói. Hãy để chúng tôi nhấp vào biểu tượng bóng đèn xuất hiện ở lề trái.







Biểu tượng bóng đèn cho thấy một số gợi ý mà chúng tôi đã học được trong Ngày số 1 và Ngày số 2 của loạt bài viết này. Có một gợi ý mới rằng biểu tượng Bóng đèn hiện đang hiển thị và điều đó liên quan đến sự đổi tên của Rename. Trong cửa sổ gợi ý, biểu tượng Lightbulb hiển thị tất cả các _productListphiên bản được tô sáng và nói đổi tên tất cả các phiên bản thành tên mới, tức là _allProductskhi bạn xem trước các thay đổi bằng cách nhấp vào Xem trước Thay đổi liên kết được hiển thị ở dưới cùng của cửa sổ đề xuất, nó sẽ hiển thị các thay đổi kết quả bạn sẽ nhận được một khi biến được đổi tên.
















Trong bản xem trước, bạn có thể thấy rõ những thay đổi sẽ diễn ra sau khi biến được đổi tên. Hãy để chúng tôi nhấp vào áp dụng các thay đổi và bạn sẽ thấy rằng phương thức này có một biến mới được thay đổi ngay bây giờ tại tất cả các trường hợp.

 1: using System;
 2: using System.Collections.Generic;
 3: using System.Linq;
 4: using System.Text;
 5: using System.Threading.Tasks;
 6:
 7: namespace VS2015ConsoleApplication
 8: {
 9:     public class MyProducts :IProducts
10:     {
11:         List<product> _allProduct = new List<product>();
12:         public MyProducts()
13:         {
14:             _allProduct.Add(new Product {ProductCode="0001",ProductName="IPhone",
        ProductPrice="60000",ProductType="Phone",ProductDescription="Apple IPhone" } );
15:             _allProduct.Add(new Product { ProductCode = "0002", ProductName = "Canvas",
        ProductPrice = "20000", ProductType = "Phone", ProductDescription = "Micromax phone" });
16:             _allProduct.Add(new Product { ProductCode = "0003", ProductName = "IPad",
        ProductPrice = "30000", ProductType = "Tab", ProductDescription = "Apple IPad" });
17:             _allProduct.Add(new Product { ProductCode = "0004", ProductName = "Nexus",
        ProductPrice = "30000", ProductType = "Phone", ProductDescription = "Google Phone" });
18:             _allProduct.Add(new Product { ProductCode = "0005", ProductName = "S6",
        ProductPrice = "40000", ProductType = "Phone", ProductDescription = "Samsung phone" });
19:
20:         }
21:
22:         public Product GetProduct(string productCode)
23:         {
24:             return _allProduct.Find(p => p.ProductCode == productCode);
25:         }
26:
27:         public List<product> GetProductList()
28:         {
29:             return _allProduct;
30:         }
31:     }
32: }

Bây giờ, hãy chạy ứng dụng để kiểm tra xem các thay đổi có ảnh hưởng đến chức năng của ứng dụng hay không. Nhấn F5.

Rõ ràng là ứng dụng không có lỗi xây dựng và tạo ra kết quả tương tự như trước đó. Có một điều mà nhà phát triển cần quan tâm, đôi khi việc đổi tên có thể gặp rủi ro và khó khăn trong cơ sở mã lớn, vì vậy, trong khi đổi tên, bạn nên xem qua phần xem trước, tức là do cửa sổ gợi ý đưa ra.

Hãy lấy một kịch bản khác. Mở tệp Program.cs và thực hiện đổi tên trên myProducts đối tượng.








Lần này, chúng tôi sẽ đổi tên thông qua menu ngữ cảnh. Nhấp chuột phải vào myProductstên đối tượng và bạn sẽ thấy menu ngữ cảnh mở. Có một tùy chọn đổi tên trên menu ngữ cảnh đã mở.













Ở phía trước tùy chọn Đổi tên, có một phím tắt có sẵn, ví dụ: Ctrl + R, Ctrl + R. Khi bạn chọn Đổi tên, bạn sẽ nhận thấy rằng trải nghiệm đổi tên ở đây là khác nhau, tất cả các trường hợp đổi tên sẽ được tô sáng. Có một cửa sổ mới xuất hiện ở góc bên phải của cửa sổ mã có một vài tùy chọn khác. Bây giờ nếu bạn đổi tên tên đối tượng, các biến được tô sáng khác sẽ được đổi tên một cách nhanh chóng trong khi gõ. Để đóng cửa sổ Đổi tên, bạn có thể nhấp vào nút chéo trên cửa sổ đó. Lưu ý rằng tùy chọn đổi tên này thông qua menu ngữ cảnh nhanh hơn nhiều so với trước đó và cho phép bạn đổi tên một cách nhanh chóng trong một bước duy nhất với xem trước trực tiếp trong khi gõ. Khi biến được đổi tên và bạn đóng cửa sổ, tất cả các tô sáng sẽ biến mất và bạn nhận được một biến được đổi tên sạch ở tất cả các lần xuất hiện.







Tôi đã thay đổi tên đối tượng từ myProductsthành products.

 1: using System;
 2: using System.Collections.Generic;
 3: using System.Linq;
 4: using System.Text;
 5: using System.Threading.Tasks;
 6:
 7: namespace VS2015ConsoleApplication
 8: {
 9:     class Program
10:     {
11:         static void Main()
12:         {
13:             var myProducts = new MyProducts();
14:             Console.WriteLine( String.Format("Product with code 0002 is : {0}",
                  myProducts.GetProduct("0002").ProductName));
15:             Console.WriteLine(Environment.NewLine);
16:             var productList = myProducts.GetProductList();
17:             Console.WriteLine("Following are all the products");
18:
19:             foreach (var product in productList)
20:             {
21:                 Console.WriteLine(product.ProductName);
22:             }
23:             Console.ReadLine();
24:         }
25:     }
26: }

Đổi tên xung đột

Chúng ta hãy lấy một kịch bản khác trong đó chúng ta cố gắng đổi tên một biến thành một tên khác đã được gán cho bất kỳ biến nào khác trong cùng phương thức hoặc thử đổi tên một thuộc tính của một lớp có thuộc tính khác có cùng tên với tên mới. ProductVí dụ, chúng ta hãy lướt qua  lớp học. Productlớp chứa các Productthuộc tính, chúng ta hãy thử đổi tên thuộc ProductNametính. Nhấp chuột phải vào thuộc ProductNametính và mở cửa sổ Đổi tên bằng cách nhấp vào Đổi tên từ menu ngữ cảnh.













Chúng tôi sẽ thay đổi tên của ProductNametài sản thành ProductCode. Chúng tôi đã có ProductCodesẵn tài sản trong lớp này. Hãy cho chúng tôi xem những gì xảy ra. Lưu ý rằng khi bạn bắt đầu nhập tên mới của thuộc ProductNametính vào ProductCode, cửa sổ đổi tên sẽ hiển thị lỗi với màu Đỏ và thuộc tính đã có ProductCodecũng hiển thị một hộp màu đỏ xung quanh nó.

Tại đây, Visual Studio 2015 thông minh nói rằng tên thuộc tính mới đã tồn tại trong lớp và thay đổi này có thể dẫn đến xung đột. Bây giờ bạn biết rằng thay đổi này có thể khiến ứng dụng của bạn bị hỏng, vì vậy chỉ cần nhấn thoát và cửa sổ đổi tên sẽ biến mất với tên mới của bạn được hoàn nguyên về tên cũ.













Do đó, Visual Studio giúp phát hiện bất kỳ xung đột đổi tên nào và đề xuất giải quyết chúng.

Đổi tên quá tải, chuỗi, nhận xét mã

Hãy để chúng tôi có thêm một kịch bản. Thêm một phương thức quá tải có tên GetProductvào IProductgiao diện và thực hiện phương thức đó trong MyProductslớp.

 1: interface IProducts
 2:  {
 3:      Product GetProduct(string productCode);
 4:      Product GetProduct(string productCode,string productName);
 5:      List<product> GetProductList();
 6:  }
 1: /// <summary>
 2:       /// GetProduct
 3:       /// </summary>
 4:       ///<param name="productCode" />
 5:       /// <returns></returns>
 6:       public Product GetProduct(string productCode)
 7:       {
 8:           return _allProduct.Find(p => p.ProductCode == productCode);
 9:       }
10:
11:       /// <summary>
12:       /// GetProduct with productCode and productName
13:       /// </summary>
14:       ///<param name="productCode" />
15:       ///<param name="productName" />
16:       /// <returns></returns>
17:       public Product GetProduct(string productCode, string productName)
18:       {
19:           return _allProduct.Find(p => p.ProductCode == productCode && p.ProductName==productName);
20:       }
21:

Bây giờ hãy thử đổi tên GetProductphương thức trong MyProductslớp. Đặt con trỏ vào giữa GetProducttên phương thức và nhấn Ctrl + R, Ctrl + R. Cửa sổ đổi tên sẽ được mở như hình dưới đây:







Bạn thấy ở đây cửa sổ Đổi tên mở ra có thêm vài tùy chọn như hiển thị bên dưới:












Nếu bạn chọn hộp kiểm để bao gồm quá tải, thì quá tải của phương thức mà chúng tôi đang đổi tên cũng được đổi tên, trong trường hợp này nếu chúng tôi chọn các tùy chọn đó, phương thức quá tải GetProduct()cũng được đổi tên.







Nếu chúng ta cũng chọn tùy chọn thứ hai, thì các nhận xét mã cũng được đổi tên khi chúng ta đổi tên phương thức thành tên mới. Tên nếu tồn tại trong các nhận xét mã cũng được đổi tên thành tên mới.








Tùy chọn đổi tên cũng cho phép đổi tên strings liên quan cho tên đó, tức là tùy chọn thứ ba. Bạn cũng có thể xem trước các thay đổi trước khi đổi tên. Cửa sổ thay đổi xem trước hiển thị cho bạn tất cả các lần xuất hiện sẽ vẫn cung cấp cho bạn một lần nữa để xem lại và chọn bỏ chọn thay đổi bạn muốn diễn ra trong một trường hợp cụ thể. Ở đây, tôi đang cố gắng thay đổi GetProduct tên phương thức thành FetchProduct. Hãy để chúng tôi kiểm tra hộp kiểm Xem trước thay đổi và nhấn nút Áp dụng.












Một cửa sổ xem trước sẽ được mở. Chú ý rằng không chỉ cho một tập tin cụ thể, nhưng cửa sổ này tích tụ tất cả các lĩnh vực thể nơi sự thay đổi này có thể diễn ra và ảnh hưởng đến các mã như trong MyProduct.cs tập tin, IProducts.cs giao diện và program.cs tập tin. Nó nói rằng khi một tên phương thức được thay đổi, nó cũng sẽ phản ánh trong các tệp này. Bây giờ nó là lựa chọn của một nhà phát triển, có nên để sự thay đổi đó xảy ra hay không. Vì vậy, cửa sổ xem trước cung cấp tùy chọn cho nhà phát triển để kiểm tra hoặc bỏ chọn hộp kiểm cho tệp bị ảnh hưởng tương ứng để thay đổi đó diễn ra hay không. Đề xuất mã và cơ chế hỗ trợ mã của Visual Studio mạnh đến mức nó chăm sóc tất cả các sửa đổi và tự động hóa rất thông minh.

Trong trường hợp này, tôi đã không bỏ chọn bất kỳ tệp nào và để thay đổi đó xảy ra. Nó cũng tự động đổi tên thành GetProductTìm nạp sản phẩm cho tất cả các khu vực được hiển thị bao gồm cả Nhận xét, Giao diện và tệp Chương trình.

Theo cách tương tự, bạn cũng có thể đổi tên các tham số được truyền trong một phương thức, điều này cũng sẽ bao gồm tất cả các tùy chọn đổi tên có thể như đổi tên trong nhận xét và phương thức. Như được hiển thị trong hình ảnh sau đây, nếu tôi cố gắng đổi tên tham số của FetchProduct phương thức, nó sẽ làm nổi bật tất cả các thay đổi có thể đổi tên.







Đặt con trỏ ở giữa productCodevà nhấn Ctrl + R, Ctrl + R, cửa sổ đổi tên sẽ xuất hiện và tất cả các trường hợp tham số được tô sáng, thậm chí cả nhận xét. Thay đổi tên pCodevà nhấp vào áp dụng.








Chúng tôi thấy tên tham số được thay đổi cùng với tên trong bình luận.

Phần kết luận

Trong bài viết này, chúng tôi đã đề cập đến hỗ trợ đổi tên do Visual Studio cung cấp 2015. Chúng tôi đã tìm hiểu về trải nghiệm đổi tên theo nhiều cách khác nhau bao gồm các gạch đầu dòng sau:

  • Đổi tên hỗ trợ thông qua các hành động bóng đèn
  • Thay đổi bản xem trước với các đề xuất thông minh
  • Đổi tên cửa sổ và các tùy chọn đổi tên của nó
  • Trên bay, kinh nghiệm đổi tên trực tiếp. Đổi tên khi bạn gõ.
  • Phát hiện và giải quyết xung đột trong khi đổi tên
  • Đổi tên bình luận mã

Trong phần tiếp theo của loạt bài này, tôi sẽ đề cập đến việc tái cấu trúc mã trong Visual Studio 2015.

Đối với các bài viết kỹ thuật hơn, bạn có thể tiếp cận với blog cá nhân của tôi, CodeTeddy .