寫一個方法來輸出2d 坐標點:{x:15, y:10}這個坐標點的數據
經過class的處理,我們完美的規避了程序中可能會出現的風險,同時也對數據做出了準確的限制。
根據面向對象(物件導向)的原則,我們添加了對象(物件)、添加了類以後,也就引起了另外一個問題,就是對象(物件)的聚合問題,也就是我們經常聽到的「高內聚、低耦合」的說法。
什麼是「高內聚、低耦合」呢?簡單來說,就是功能相關的事物,應該放在同一個集合中形成一個模塊,這就叫做「高內聚」,而這些模塊之間又應該是相互獨立的,不同的模塊之間,應該保持一個「低耦合」的狀態。
所以在我們的Point class 這個例子中,我們定義它的兩個坐標點,然後有一個獨立的函數DrawPoint()來輸出這個坐標點,從面向對象(物件導向)的角度來說,坐標點作為一個獨立的對象(物件),與輸出坐標應該是聚合的關係。
所以,當我們把DrawPoint()方法與坐標點Point分割的時候,就違背了聚合的原則。
比如說,我們的需求發生了變化,不僅需要我們可以輸出當前的坐標點 ,甚至需要我們輸出兩點之間的距離,那麼我們是不是又需要在不知道什麼地方,添加一個新的函數、一個新的方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
static void Main(string[] args)
{
//2d 坐標點:{x:15, y:10}
//dynamic var
Point a = new Point(); //類的實體化
a.x = 15; //數據的初始化
a.y = 10;
DrawPoint(a);
Point b = new Point();
b.x = 20;
b.y = 30;
GetDistance(a, b);
Console.Read();
}
public class Point
{
public int x;
public int y;
}
//輸出坐標點的數據
public static void DrawPoint(Point point) =>
Console.WriteLine($"左邊點為 x: {point.x}, y: {point.y}");
//兩點之間的距離
public static double GetDistance(Point a, Point b) =>
Math.Pow(a.x - b.x, 2) + Math.Pow(a.y - b.y, 2);
那麼,這個能夠統一管理所有程式碼的集合,就是class,對於DrawPoint、GetDistance這兩個方法,它們都與坐標點 Point直接相關,所以我們應該把他們這兩個方法也集中放到Point類中。
DrawPoint在Point類中,它將會是一個成員方法,依然不用返回數據,所以方法類型為void,因為它需要外部訪問,所以加上 public。
接下來要注意了,因為這個方法輸出的是當前坐標點,也就是我自己這個坐標點的信息,所以不需要傳入整合的參數public void DrawPoint(),而在成員方法中,又是可以隨意訪問它的成員變量的,所以在 Console.WriteLine中不需要Point.x,而直接使用 x 和 y就足夠了。
1
2
3
//輸出坐標點的數據
public void DrawPoint() =>
Console.WriteLine($"左邊點為 x: {x}, y: {y}");
而 GetDistance是計算兩點之間的距離,我們需要傳入的是「對方的坐標點信息」GetDistance(Point p),計算過程,我們需要計算自己的 x點和 p.x點 之間的距離,同時也需要計算自己的 y點和 對方y點 之間的距離。
1
2
3
//兩點之間的距離
public double GetDistance(Point p) =>
Math.Pow(x - p.x, 2) + Math.Pow(y - p.y, 2);
現在可以把多餘的程式碼刪除了
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Point
{
public int x;
public int y;
//輸出坐標點的數據
public void DrawPoint() =>
Console.WriteLine($"左邊點為 x: {x}, y: {y}");
//兩點之間的距離
public double GetDistance(Point p) =>
Math.Pow(x - p.x, 2) + Math.Pow(y - p.y, 2);
}
回到內函數,調用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
static void Main(string[] args)
{
//2d 坐標點:{x:15, y:10}
//dynamic var
Point a = new Point(); //類的實體化
a.x = 15; //數據的初始化
a.y = 10;
a.DrawPoint();//輸出坐標點的數據
Point b = new Point();
b.x = 20;
b.y = 30;
double result = a.GetDistance(b);//計算兩點之間的距離
Console.WriteLine(result);
Console.Read();
}
public class Point
{
public int x;
public int y;
//輸出坐標點的數據
public void DrawPoint() =>
Console.WriteLine($"左邊點為 x: {x}, y: {y}");
//計算兩點之間的距離
public double GetDistance(Point p) =>
Math.Pow(x - p.x, 2) + Math.Pow(y - p.y, 2);
}
輸出:
左邊點為 x: 15, y: 10
425