主頁 > 軟體設計 > 類與物件(中篇)

類與物件(中篇)

2021-10-23 08:54:00 軟體設計

類與物件中篇

  • 前言
  • 類的六個默認成員函式
  • 建構式和解構式
    • 1、構造
    • 2、析構
    • 3、拷貝建構式
  • 賦值運算子多載
  • const成員

前言

這篇偏難,萬字總結,需要讀者細心觀看,需要有上篇的基礎,

類的六個默認成員函式

如果一個類中什么都沒有,簡稱為空類,但空類里面會自動生成6個默認成員函式,因為這是由編譯器生成的,我們看不到,

空類:class Date {};

在這里插入圖片描述

建構式和解構式

1、構造

建構式是特殊的成員函式,需要注意的是,建構式的雖然名稱叫構造,但是需要注意的是建構式的主要任務并不是開空間創建物件,而是初始化物件

  1. 函式名與類名相同,
  2. 無回傳值,
  3. 物件實體化時編譯器自動呼叫對應的建構式,
  4. 建構式可以多載,

知道了建構式的特點,那么我們可以來看看建構式到底有什么用?

class Date
{
public:
	//建構式支持多載,那么也支持預設(全預設,半預設,預設)
	Date(int year = 1, int month = 2, int day = 3)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void SetDate(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void Display()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	Date d1;
	d1.SetDate(2018, 5, 1);
	d1.Display();

	Date d2(2021, 10, 21);
	d2.Display();
//注意:如果通過無參建構式創建物件時,物件后面不用跟括號,否則就成了函式宣告
	Date d3();
	return 0;
}

通過這一段代碼,我們可以得知,在不使用建構式時,我們只能創建物件,在呼叫方法來設定日期,使用建構式,可以在創建物件時就將日期資訊帶進去了,避免了呼叫函式的繁瑣,

  • 關于建構式全預設的問題
  1. 通過代碼我們發現,當建構式寫成全預設的時候,我們創建物件不傳參也不會報錯,編譯器會把它當成默認建構式(即無參),此時我們不需要在自己定義一個無參建構式,
  2. 我們也可以在創建物件時傳參,也不會報錯,所以這是建構式寫成全預設的好處
  3. 傳參即有參構造,不傳參即無參建構式
  • 重點 1
  1. 這里需要注意的是,建構式支持多載,我們通過有參建構式去去初始化物件的時候,也要顯示的寫上無參建構式,或者語法會出錯,
  2. 如果類中沒有顯式定義建構式,則C++編譯器會自動生成一個無參的默認建構式,一旦用戶顯式定義編譯器將不再生成
  3. 建構式既然可以多載,那么也支持預設值的用法
  4. 無參的建構式和全預設的建構式都稱為默認建構式,并且默認建構式只能有一個,注意:無參建構式、全預設建構式、我們沒寫編譯器默認生成的建構式,都可以認為是默認成員函式
  • 重點 2

建構式是一個特殊的成員函式,名字與類名相同,創建型別別物件時由編譯器自動呼叫,保證每個資料成員都有一個合適的初始值,并且在物件的生命周期內只呼叫一次

  • 重點3

關于編譯器生成的默認成員函式,有很多小伙伴會疑惑:我們不顯示寫建構式的情況下,編譯器會生成默認的建構式,但是看起來默認建構式又啥都沒干,d物件呼叫了編譯器生成的默認建構式,但是d物件year/month/_day,依舊是隨機值,那編譯器默認生成的建構式有什么用?

class Time
{
public:
	Time()
	{
		cout << "Time()" << endl;
		_hour = 0;
		_minute = 0;
		_second = 0;
	}
private:
	int _hour;
	int _minute;
	int _second;
};
class Date
{
public:
	
private:
	// 內置型別
	int _year;
	int _month;
	int _day;
	Time _tt;//自定義型別 struct、class、union
};
int main()
{
	Date d;
	return 0;
}

運行這個程式我們會發現Time 類的建構式被呼叫了,
在這里插入圖片描述
編譯器默認生成的建構式的作用:編譯器生成默認的建構式會對自定義型別成員 _tt 呼叫的它的默認成員函式,
C++把型別分成內置型別(基本型別)和自定義型別,內置型別就是語法已經定義好的型別:如int/char…,自定義型別就是我們使用class/struct/union自己定義的型別

  • 重點4

對于成員變數,我們要注意成員變數的風格,設定其名稱時要注意不要與形參重名,避免起沖突,

看程式編譯的結果,成員變數未檢測到,Set函式中相當于形參賦給形參了,
在這里插入圖片描述
雖然從上一篇,我們知道可以用this指標解決命名沖突的問題,
在這里插入圖片描述
但是,我們自己寫成員變數的時候就要注意這種沖突,避免程式崩潰,

因此我們可以用駝峰法命名或者加一個下劃線來避免命名沖突(常用的方法是加下劃線)

在這里插入圖片描述
其他方式也可以的,主要看公司要求,一般都是加個前綴或者后綴標識區分就行,

2、析構

解構式:解構式不是完成物件的銷毀,區域物件銷毀作業是由編譯器完成的,而物件在銷毀時會自動呼叫解構式,完成類的一些資源清理作業

  • 與建構式一樣解構式是特殊的成員函式,
  1. 解構式名是在類名前加上字符 ~,
  2. 無引數無回傳值,
  3. 一個類有且只有一個解構式,若未顯式定義,系統會自動生成默認的解構式,
  4. 物件生命周期結束時,C++編譯系統系統自動呼叫解構式
#include<iostream>
using namespace std;
#include<assert.h>
typedef int DataType;
class SeqList
{
public:
	// 使用了預設,當創建物件時不傳參,也不會報錯
	SeqList(int capacity = 10)
	{
		_pData = (DataType*)malloc(capacity * sizeof(DataType));
		assert(_pData);
		_size = 0;
		_capacity = capacity;
	}
	~SeqList()
	{
		if (_pData)
		{
			free(_pData); // 釋放堆上的空間
			_pData = NULL; // 將指標置為空
			_capacity = 0;
			_size = 0;
		}
		cout << "~SeqList()" << endl;
	}
private:
	int* _pData;
	size_t _size;
	size_t _capacity;
};
int main()
{
	SeqList q(20);
	//物件宣告周期結束就會呼叫解構式,清理指標_pData,_size,_capacity
	return 0;
}

在這里插入圖片描述

與建構式一樣,如果一個類中包含自定義型別,也會呼叫它的解構式

class String
{
public:
String(const char* str = "jack")
{
	_str = (char*)malloc(strlen(str) + 1);
	strcpy(_str, str);
}
~String()
{
	cout << "~String()" << endl;
free(_str);
}
private:
	char* _str;
};
class Person
{
private:
	String _name;
	int _age;
};
int main()
{
	Person p;
	return 0;
}

在這里插入圖片描述

3、拷貝建構式

在大多數情況下,我們可能會復制一個物件,也就是拷貝的意思,那么我們如何在創建物件時,創建一個與這個物件一某一樣的新物件呢?

class Date
{
public:
	Date(int year = 1900, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	//拷貝建構式也是建構式,相當于多載
	//const保證不修改,因為是拷貝,所以修改的話沒有任何意義
	//但這里必須得用參考,為什么?繼續看下面
	Date(const Date& d)
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;
	}
	void Print()
	{
		cout << _year << " " << _month << " " << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	Date d1;
	Date d2(d1);//傳參
	d1.Print();
	d2.Print();
	return 0;
}

將物件當做引數傳過去即可
在這里插入圖片描述

建構式:只有單個形參,該形參是對本型別別物件的參考(一般常用const修飾),在用已存在的類型別物件創建新物件時由編譯器自動呼叫

上面的代碼中留了一個問題,為什么拷貝構造的函式要用參考的形式,如果用傳值的方式會出現什么后果?
在這里插入圖片描述

這里會出現無窮遞回,傳參也是一個拷貝構造,注意拷貝構造方法傳參考,不要傳值

我們再來看看若未顯示定義拷貝建構式,編譯器默認生成的拷貝建構式,

class A
{
public:
	A()
	{

	}
	A(const A& a)
	{
		cout << "const A& a" << endl;
	}
};
class Date
{
public:
	Date(int year = 1900, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void Print()
	{
		cout << _year << " " << _month << " " << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
	A _a;
};
int main()
{
	Date d1;
	// 這里d2呼叫的默認拷貝構造完成拷貝,d2和d1的值也是一樣的
	Date d2(d1);
	d1.Print();
	d2.Print();
	return 0;
}

在這里插入圖片描述

通過編譯結果我們可以看到,使用編譯器的默認建構式效果是一樣的,編譯器生成的默認拷貝建構式已經可以完成位元組序的值拷貝了,

我們不寫,編譯器默認生成拷貝構造,跟構造和析構又不太一樣的
不會去區分內置型別和自定義型別成員,都會處理
1、內置型別,位元組序的淺拷貝(按位元組序的拷貝)
2、自定義型別,會去呼叫他的拷貝構造完成拷貝

但這只是對于日期類,如果對于其他類也可以使用編譯器默認的拷貝建構式嘛?

class String
{
public:
	String(const char* str = "jack")
	{
		_str = (char*)malloc(strlen(str) + 1);
		strcpy(_str, str);
	}
	~String()
	{
		cout << "~String()" << endl;
		free(_str);
	}
private:
	char* _str;
};
int main()
{
	String s1("hello");
	String s2(s1);
} 

在這里插入圖片描述
這也就是位元組序的值拷貝(淺拷貝)帶來的危險,至于怎么解決,我們后期在來學習,

所以我們可以總結為以下幾點

  1. 拷貝建構式是建構式的一個多載形式,
  2. 拷貝建構式的引數只有一個且必須使用參考傳參,使用傳值方式會引發無窮遞回呼叫
  3. 要注意淺拷貝帶來的危險

賦值運算子多載

引入:C++為了增強代碼的可讀性引入了運算子多載,運算子多載是具有特殊函式名的函式,也具有其回傳值型別,函式名字以及引數串列,其回傳值型別與引數串列與普通的函式類似

函式名:關鍵字operator加多載的運算子符號
函式原型:回傳值型別 operator運算子(引數串列)

注意:

  • 不能通過連接其他符號來創建新的運算子:比如operator@
  • 多載運算子必須有一個型別別或者列舉型別的運算元
  • 用于內置型別的運算子,其含義不能改變,例如:內置的整型+,不 能改變其含義
  • 作為類成員的多載函式時,其形參看起來比操作數數目少 1 成員函式的運算子有一個默認的形參this,限定為第一個形參
  • .* 、:: 、sizeof 、?: 、. 注意以上5個運算子不能多載,這個經常在筆試選擇題中出現

我們先來看看 == 運算子的多載

class Date
{
public:
	Date(int year = 1900, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	//private:
	int _year;
	int _month;
	int _day;
};
// 這里會發現運算子多載成全域的就需要成員變數是共有的,那么問題來了,封裝性如何保證?
// 這里其實可以用我們后面學習的友元解決,或者干脆多載成成員函式,
bool operator==(const Date& d1, const Date& d2)
{
	return d1._year == d2._year
			&& d1._month == d2._month
			&& d1._day == d2._day;
}
void Test()
{
	Date d1(2018, 9, 26);
	Date d2(2018, 9, 27);
	cout << (d1 == d2) << endl;
}
int main()
{
	Test();
	return 0;
}

我們通過多載 == 運算子,然后就可以判斷兩個物件是否相等了,但是這里沒有封裝成成員函式,安全性不高,接下來我們多載成成員函式

class Date
{
public:
	Date(int year = 1900, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	bool operator==(const Date& d2)
	{
		return _year == d2._year
			&& _month == d2._month
			&& _day == d2._day;
	}
	//private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	Date d1(2018, 9, 26);
	Date d2(2018, 9, 27);
	d1 == d2;  
// d1==d2 -> d1.operator(d2) -> d1.operator(&d1,d2)
	d1.operator==(d2);// 與d1==d2效果一樣
	return 0;
}

這里我們多載成了成員函式之后,發現不能直接去呼叫這個函式了,只能用物件去呼叫這個介面函式,體現了封裝的好處,

我們這里也發現封裝之后有兩種呼叫方式,他們的效果是一樣的,匯編代碼是一樣的,

在這里插入圖片描述
我們再來看看經常用到的賦值運算子多載

class Date
{
public:
	Date(int year = 1900, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	Date(const Date& d)
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;
	}
	Date& operator=(const Date& d)
	{
		if (this != &d)
		{
			_year = d._year;
			_month = d._month;
			_day = d._day;
		}
		return *this;
	//注意回傳參考,為什么就不用我說了,前面講到的臨時變數
	}
	void Traverse()
	{
		cout << _year << _month << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	Date d1(2021, 10, 22);
	Date d2;
	d2 = d1;
	d2.Traverse();
	return 0;
}

在這里插入圖片描述
通過多載,我們就可以將 d1 賦值給 d2,但是這里同學們發現了為什么運算子多載要回傳參考嘛?

在這里插入圖片描述

回傳參考,減少了一次拷貝構造
賦值運算子主要有四點:

  1. 引數型別
  2. 回傳值
  3. 檢測是否自己給自己賦值
  4. 回傳*this
  5. 一個類如果沒有顯式定義賦值運算子多載,編譯器也會生成一個,完成物件按位元組序的值拷貝

這里我們會發現編譯器生成的默認賦值多載函式已經可以完成位元組序的值拷貝,但是我們也還是需要自己寫賦值多載函式的,上面講到的對同一塊空間釋放的問題,忘記的可以翻翻上面,也是淺拷貝的問題,后面再說,

總結:

  1. 運算子默認都是給內置型別變數使用的
  2. 自定義型別的變數想用這些運算子,得自己進行運算子多載
  3. 自己進行運算子多載,也就是寫一個函式去定義運算子的行為

const成員

const修飾類的成員函式:
將const修飾的類成員函式稱之為const成員函式,const修飾類成員函式,實際修飾該成員函式隱含的this指標,表明在該成員函式中不能對類的任何成員進行修改,
在這里插入圖片描述

class Date
{
public:
	//加了const,表示成員函式為一個常函式,不能對任何成員做修改
	void Display() const
	{
		cout << _year << " " << _month << " " << _day << endl;
	}
private:
	int _year = 0; // 年
	int _month = 0; // 月
	int _day = 0; // 日
};
void Test()
{
	Date d1;
	d1.Display();
	
}
int main()
{
	Test();
	return 0;
}

如果修改了,會出現下面的語法錯誤
在這里插入圖片描述

const總結

  1. 成員函式加const,是有好處的,這樣const 物件 和 非const物件都可以呼叫
  2. 不是所有成員函式都要加const
  3. 如果一個成員函式內部需要修改成員變數,那就不用加const,比如初始化的函式等
  4. 如果對成員不做任何修改的函式,在寫的時候最好加上const

const 常考

  1. const物件可以呼叫非const成員函式嗎? 不能
  2. 非const物件可以呼叫const成員函式嗎? 能
  3. const成員函式內可以呼叫其它的非const成員函式嗎? 不能
  4. 非const成員函式內可以呼叫其它的const成員函式嗎? 能

const權限可以縮小,不能方法

不明白的可以去看看const的用法

在這里插入圖片描述

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/332129.html

標籤:其他

上一篇:在Oracle的SQL中通過不同的值進行分組和排序

下一篇:基于比較的七種常見排序演算法

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more