看板java
标 题Re: 请问阵列的宣告…
发信站KKCITY (Sun Jun 20 05:38:00 2004)
转信站ptt!ctu-reader!ctu-peer!Spring!news.nctu!news.ntu!bbs.ee.ntu!news.kkci
※ 引述《[email protected] (benqer)》之铭言:
> script 是着重在runtime的动态, 弹性很大, 但相对来说型别的使用一有错误,
> 会在runtime出现无法预期的错误, 这种错误很难debug. 这就是为何type-safety重要
> 的原因.
> 泛型则是着重在compile-time的动态, 型别在compiler-time具现时一旦有错,
> 也只是compile-time error, 够格的compiler都能够直接指出错在哪里. 不需要
> 等到runtime再来debug.
很赞同 Wiseman 所言。
但我现在想说的,是一个发展方向,而不是现状。
严格的型别定义,与编程弹性,一直使编译器有很大的困扰,但并非不可解决。
我举两个简单的例子,第一个例子是导引,第二个例子是深入。
导引范例:
int fa(int x)
{
if (x % 1)
{
cout << "Yes!";
return 1;
} else {
cout << "No!";
return 0;
}
}
我一直希望 C/C++ 能够把他化简成
function fa (x)
{
if (x % 1)
{
cout << "Yes!";
return 1;
} else {
cout << "No!";
return 0;
}
}
提问一:
或许有人说,那怎麽知道要 return 什麽呢?
这就是编译器的工作了,编译器负责检查「回传型态的一致性」。
如果回传型态具有一致性,那就应该要知道回传什麽了吧。
提问二:
那怎麽给定 x 的型态?
这也是编译器的工作。目前不是发展了 template 技术吗?
把他想成隐式 template 不就达成了。
不过编译器会很累,必须要检查该型别是否满足所有算子(甚至成员)。
不过要满足上述两项功能,自动型别转换有必要作检讨。
深入范例:(很重要的编程风格范例)
尝试思考下面这个例子:
function dynamic (x)
{
if (x % 1)
return Bicycle(x);
else
return Car(x);
}
这可好了,编译器该如何做?我尝试着将上面的函式翻译成 C++
解法一:使用基础类别再加以继承之。
class CC { …略… } ;
class Bicycle : CC { …略… };
class Car : CC { …略… };
template<class T>
CC * dynamic(T x)
{
if (x%1)
return new Bicycle(x);
else
return new Car(x);
}
解法二:利用 union
此法建议在两者所使用的空间差异不大时使用,
此解法还必须使这三个先备类别支援 (type &) 建构子才行
struct UBC
{
char * style_name;
union cont { Bicycle b; Car c; };
}
template<class T>
UBC dynamic(T x)
{
if (x % 1)
return (UBC) {"bicycle", Bicycle(x)}; // C99 新增语法
else
return (UBC) {"car", Car(x)};
}
天啊!一个简洁的编程样式,翻译成 C++ 居然要如此的麻烦!
用了 script 之後的小小感想。这并不是理论上的困难,而是技术量太大。
--
┌─────◆程式设计乐园◆─────┐ ╱ ╱  ̄ ▌ ̄  ̄ ╲╱ BBS 城邦
│ CSZone.kkcity.com.tw │ ╲ ╲ ╴ ▌ ▌ ▏ KK免费拨接
└──《From:61.231.190.51
》──┘ 电话:449-1999 帐号:kkcity 密码:kkcity