本文最后更新于:June 30, 2023 pm
本文作者:[wangwenhai] # 概要:C语言家族的一些历史遗留和困惑
C语言家族的一些历史遗留和困惑
#include <stdio.h>
int main(){
printf("hello world\n");
return 0;
}
字符串表示
const char * s1 = "hello world";
char s2[] = "hello world";
困惑点
- 两种语义化类型表示同一目标,产生歧义;
- 提出“字符串指针”,打破了“指针是一个内存编号”的规范;
字符串改良建议
- const char * 类型建议直接产生新类型叫:原子,或者tag;
- 取消”字符串“的概念;直接叫字符序列;或者字符列表
- 统一字符序列的指针是一个int值的概念,取消”静态字符串常量指针“的概念
示例代码
// 定义一个静态字面值常量称之为原子
atom a = "ok";
// 字符序列指针可以取原子的地址
char *cptr = &a;
从上面的优化方案可以看出,“字符串”用”原子“类型直接替代以后,消除了困惑和歧义
数组的困惑
array的谷歌翻译:
动词
排列
array, arrange, range, put in order
部署
deploy, dispose, arrange, array
名词
排列
arrangement, array, permutation
矩阵
matrix, array
序列
sequence, array, suite
大批
bulk, large quantity, array, legion, considerable
上述翻译,就没有一个含义和“数”相关,这是中文翻译的败笔;个人认为数组的翻译堪比”套接字“,”句柄”,”鲁棒”,完全是译者水平不足的体现。
数组改良建议
中文名称改为:序列,或者列表比较合适,比较适合直观理解。
新的概念
序列:一系列相同元组的集合。
示例代码:
int a[4] = {0,1,2,3};
T a[n] = {...};
类型定义
typedef:冗长而且没有语义化,建议将该关键字改良成type
.
type int int_t;
type char char_t (*fp)(void);
函数指针
C的函数指针和指针混杂起来,不利于语义化和理解
void (*fun)(void *);
(*fun)本质上是个指针,可以用一个关键字类型替代
改进建议
新增fun类型直接定义函数
// define
void call(fun f){
f();
}
// fun with name
void fun f = (void *){}
call(f);
// anynomous fun
call(void fun(void *){}){f()}
说明
虽然C可以通过宏定义来实现各种类型,但是我一直认为原生支持是最有利于理解和学习的.
typedef void (*fun)(void*);
void fun f = (void *){}
开箱即用不好吗?
Java的困惑
基本类型
数据类型 默认值
byte 0
short 0
int 0
long 0L
float 0.0f
double 0.0d
char 'u0000'
boolean false
基本类型是历史遗留,是当年JamsGalslin这些人设计的不足之处,从谷歌相关资料也可证实该说法。其实基本类型不应该出现在任何OOP编程语言中,基本类型出现在OOP语言中打破了规则,而且引入的新概念会含糊不清,
抽象类
抽象类和接口的功能几乎是重合的,完全可以用抽象类来当做接口使用,所以Interface或者abstract class意义何在?该处也是遗留问题,也许最完美的设计应该是没有abstract class。这点从后生的编程语言可以看出,比如JS,Python等,就没有混杂的这两种类型。
纯正的OOP思想就是继承,代码复用。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!