我们看到很多面向对象编程的优秀的项目,
我们看到一个类继承一个类地,并且传递的类实例,看起来是相当庞大的项目,拥有相当多设计好的类,并且每个类设计的都很好:
但是比如我这等初级程序员,设计项目的时候,
1、根本很难把一个类设计的很好
2、想不到很多的接口继承或类实现接口的设计
3、比如在设计这个类的时候:
class TypeScriptDocumentSymbolProvider implements vscode.DocumentSymbolProvider {
public constructor(
private readonly client: ITypeScriptServiceClient,
private readonly cachedResponse: CachedResponse<Proto.NavTreeResponse>,
) { }
public async provideDocumentSymbols(document: vscode.TextDocument, token: vscode.CancellationToken): Promise<vscode.DocumentSymbol[] | undefined> {
const file = this.client.toOpenTsFilePath(document);
if (!file) {
return undefined;
}
const args: Proto.FileRequestArgs = { file };
const response = await this.cachedResponse.execute(document, () => this.client.execute('navtree', args, token));
if (response.type !== 'response' || !response.body?.childItems) {
return undefined;
}
// The root represents the file. Ignore this when showing in the UI
const result: vscode.DocumentSymbol[] = [];
for (const item of response.body.childItems) {
TypeScriptDocumentSymbolProvider.convertNavTree(document.uri, result, item);
}
return result;
}
1)不会想到:private readonly
这些字段的功能,不会纳入类设计
2)不会想到泛型的利用
private readonly cachedResponse: CachedResponse<Proto.NavTreeResponse>
3)比如这个参数:是有固定的类依据,如果是我的话,会可能直接想到传输string或者number这样的初级的类型:这些优秀的软件工程师为何就能思考到使用document: vscode.TextDocument
这样的高级参数呢?
public async provideDocumentSymbols(document: vscode.TextDocument, token: vscode.CancellationToken)
4)比如返回的这个值,是这样,我看都看不懂,他们是基于什么来进行设计的呢?是在设计的时候就想要一个什么样的形式结果(eg. : Promise<vscode.DocumentSymbol[] | undefined>
)再进行设计的是吗?
: Promise<vscode.DocumentSymbol[] | undefined>
这是因为 VSCode 的总负责人兼设计师 Erich Gamma, 是《设计模式:可服用面向对象软件基础》的四人帮之一,目前我们看到的各种设计模式的理论基础都由此书奠定。此外,Erich Gamma 还参与设计了 Eclipse(另一款知名的编辑器)。除负责人外的其它核心成员也有丰富的编辑器开发经验,平均年龄40+。新成员也是开源社区知名插件的开发者。
而对于我们这些没有优秀设计能力的开发者,可以先提高抽象能力,抽象的多了,自然也知道应该如何设计了。
项目刚开始的时候功能比较简单,只有简单几个类。
但是随着项目的进行,功能越来越多,代码越来越复杂,这时候就会将重复的功能抽象出来作为公共基类,让其它类继承它。
项目继续发展,只继承一次也不够,就需要增加中间层,编写各种各样的接口和抽象类。
刚开始的时候传递 number/string 就行了,但是随着项目逐渐复杂,已经不能满足需要,就重构成复杂对象,携带足够多的信息,这样才能满足我们的需要。
大型项目也是从小型项目发展而来的。但是当你有了多个主导大型项目的经验,就可以在开始新项目时大概明白项目的发展方向,提前设计和规划。