`
jack
  • 浏览: 392841 次
  • 来自: 温州
社区版块
存档分类
最新评论

语言逻辑边界和新手友好

阅读更多
下面的结论是对比我和arath的两个项目组得出的一个初步结论

  开发语言的逻辑边界越明显,新手在用这种语言做项目时,越不容易失去控制。

最近我和arath都有个类似的项目,就是需要写一个比较高性能的服务器程序。为此我们讨论了很多次。arath的项目用C,我的项目用C++.

   其中有一次,arath提到了项目中的基础设计有些被改乱了。排除了各种人为因素之外,C代码明显比C++代码更加容易随意编写,而不易检查。C并不存在某种物理或者逻辑上的设计边界,C++多了个class的概念。且抛开是否因为OO,明显的C++可以用class来做出最简单设计边界。

   新手,模仿性强且极易把代码写飞,能够很快的离开原本设计。C++ Class 划定了一个基本模块,可以让新手有模仿之处。但是C++ Class的边界存在让其多了一个参考坐标,使其不易跑飞。
   C++ Class 一般都是一个h,一个cpp配对,当需要在A类中添加代码,只能在A.h和A.cpp中添加。如果某块代码归类归错,也是极易查找和调整的。C相对没有这样明显的逻辑和物理边界。如果没有对设计上有个清晰了解和没有抵抗随意编写代码的诱惑,时间长了,最终代码可想而知。

   编写C++代码会比编写C代码更容易遇到各种问题,但是好在循序渐进。class,基本类库,框架,线程,DLL等等这些都是边界,这类边界的存在,新手可以一步一步的前进,每遇到一个边界,就需要停下来摸索和学习。class和class的交互,如何调用基本类库,如何使用框架,线程间怎么通讯,如何编写和调用DLL。
 
    C#,JAVA则明显比C++对于新手更加友好。强类型,不能多继承,单文件代码,这些规则比C++更加让新手更加容易理解和模仿。Ruby的Class边界极易打破,而且还可以写在不同的文件中。还有Mixin功能。就这点而言,新手项目不应采用Ruby。

   
  

  
分享到:
评论
64 楼 jack 2006-10-18  
ddd 写道
"语言本身的边界限制能力"这个怎么说是"具体语言无关性"呢?:)
不过不说这个了,我认为应该是:新手在用某个特定语言的时候有没有那种自动给自己定边界的心理。
不要上升到语言本身这个层次……那样必然说不请。

.. 这个有啥好讨论的。新手是一定没的。而且真不知道你怎么想的,我都明确给出讨论的主题和条件了,怎么还在跑...
63 楼 ddd 2006-10-17  
"语言本身的边界限制能力"这个怎么说是"具体语言无关性"呢?:)
不过不说这个了,我认为应该是:新手在用某个特定语言的时候有没有那种自动给自己定边界的心理。
不要上升到语言本身这个层次……那样必然说不请。
62 楼 jack 2006-10-17  
ddd 写道
其次如果你这么理解只能说明了你的能力还不足以理解主题以及后面的sample.
这有什么,我以前就有过void*的思路,只不过后来被否决了,所以说是你的能力不足。


主题是

语言本身的边界限制能力对于项目管理的影响

讨论条件是

1。项目需要分出很多功能模块。
2。项目成员是刚刚毕业的新手。
3。全部功能都是新手们完成
4。项目一定要做完成.
5。新手们模仿能力强,但是无很强的项目经验和技术技能。
6。新生们经常忘记各种善意的提醒。

之所以限定新手,因为在成熟的技术人员身上,不同语言边界限制的差异基本上没有太多影响。
这种横向的项目对比,极少能够碰到。所以才有这个帖子。

这个帖子也是具体语言无关性的。
61 楼 ddd 2006-10-17  
其次如果你这么理解只能说明了你的能力还不足以理解主题以及后面的sample.
这有什么,我以前就有过void*的思路,只不过后来被否决了,所以说是你的能力不足。
60 楼 Arath 2006-10-17  
ddd 写道

跑题的原因早说了,和主题有关,把这个定义为炫耀……你自言自语去吧。
再看看你给出的代码,除了多了几行以外有什么实际意义?不就是要不出现结构名么?有啥意义?
这就是炫耀,写没有意义的代码。

首先你没有抓到主体而在死扣一个点,其次如果你这么理解只能说明了你的能力还不足以理解主题以及后面的sample.

ddd 写道

你还知道这里是一个大家讨论问题解决问题的地方啊,我还以为你不知道呢


那么请说一下我怎么不在讨论问题?

ddd 写道

技巧和见识不是用来炫耀的,你认为这些我不会?那些os api clib不知道?没必要说的东西不说而已,纯粹炫耀自己只能让内行人耻笑。


难道说这就是你所谓的讨论问题?

该说的都说了,打住吧, 当然是说我自己~
59 楼 ddd 2006-10-17  
Arath 写道

从你抓住主题某一点跑题到现在只能说明你自己的浅薄.

跑题的原因早说了,和主题有关,把这个定义为炫耀……你自言自语去吧。
再看看你给出的代码,除了多了几行以外有什么实际意义?不就是要不出现结构名么?有啥意义?
这就是炫耀,写没有意义的代码。
Arath 写道

这里是一个大家讨论问题解决问题的地方

你还知道这里是一个大家讨论问题解决问题的地方啊,我还以为你不知道呢
58 楼 runes 2006-10-17  

我想玩以下ARM, 能提点建议吗?

入门级的,就是如何尽快的动起手来,比如开发板之类的事情。

为了不影响整个楼主的讨论的题目

请: http://www.iteye.com/topic/28033
57 楼 Arath 2006-10-17  
不是ARM, 应该算是MIPS的变种
其实嵌入式的东西关键要了解硬件,对于做软件的人基本不会在意寄存器、中断、IO、地址总线、内存影射等这些概念,所以这些知识一定要了解,否则有些程序就无法理解,还有一点就是底层很多东西都是用timer loop的方式做的,甚至用指令算clock,在上层看来这是很愚蠢的事情,但是的确就是这么做的
我做的项目很杂,不过基本都在较低的层次游走,有时候很无奈
56 楼 runes 2006-10-17  
你是做ARM的吗?我正想学习以下这方面。
55 楼 Arath 2006-10-17  
runes 写道

btw, asm?哈哈,我现在还在用

win32 ASM ?


不是,嵌入式系统上
其实我也讨厌ASM,但是和硬件密切的代码如果用C反而让人糊涂
54 楼 runes 2006-10-17  
Arath 写道

有些跑题,实际上关键还在于如何掌握边界的处理问题.
Jack的立意就在于此.
语言的终究是些符号,只是看表现力强不强了.
而对于语言所描述或者说实现的目标才是最重要的.
目前的项目代码越写越多,当年的wolf 3d采用了2000行代码,而如今随便一个程序都有上万行代码,所以在开发过程中的管理控制尤为重要,其中边界问题就是一个点,目前的大部分语言对边界控制都有一些特性加以限制,但是这些限制不可能完全避免破坏边界, 特别是对于很多新手或者能力较差的人.

btw, asm?哈哈,我现在还在用


win32 ASM ?
53 楼 Arath 2006-10-17  
ddd 写道

写成typedef void* handle_t就是自己给自己找麻烦。
要写也得typedef struct _tagPrivate *handle_t
你写那堆代码除了耍指针转化的技巧以外,没任何意义。

技巧和见识不是用来炫耀的,你认为这些我不会?那些os api clib不知道?没必要说的东西不说而已,纯粹炫耀自己只能让内行人耻笑。


炫耀?好吧既然你这么说我就炫耀一把!
而你的回答只能说明你自己弱点!
至于说技巧和见识是不是用来炫耀的,我从来没有这么想过,反而从你的回帖真看到.
从你抓住主题某一点跑题到现在只能说明你自己的浅薄.
这里是一个大家讨论问题解决问题的地方,不是互相抬杠乃至指责的地方,搞清楚这点对你很重要.
52 楼 Arath 2006-10-17  
runes 写道
Arath 写道
我可能说的不够明白,如果你拿某个特性来说C++自然要强于C,因为很多事情都是编译器来实现支持的而不是语法本身可以完成的,所以我所说的模拟是就实际的开发程序而言的.
Template、try catch等从语法角度当然用C做不了一模一样的,但是同样的算法实现的功能C可以做到.
btw, template可以自己写个简单的预编译器实现,只要有这个能力.


干脆asm 吧


有些跑题,实际上关键还在于如何掌握边界的处理问题.
Jack的立意就在于此.
语言的终究是些符号,只是看表现力强不强了.
而对于语言所描述或者说实现的目标才是最重要的.
目前的项目代码越写越多,当年的wolf 3d采用了2000行代码,而如今随便一个程序都有上万行代码,所以在开发过程中的管理控制尤为重要,其中边界问题就是一个点,目前的大部分语言对边界控制都有一些特性加以限制,但是这些限制不可能完全避免破坏边界, 特别是对于很多新手或者能力较差的人.

btw, asm?哈哈,我现在还在用
51 楼 runes 2006-10-17  
ddd 写道
Arath 写道


写成typedef void* handle_t就是自己给自己找麻烦。
要写也得typedef struct _tagPrivate *handle_t
你写那堆代码除了耍指针转化的技巧以外,没任何意义。

技巧和见识不是用来炫耀的,你认为这些我不会?那些os api clib不知道?没必要说的东西不说而已,纯粹炫耀自己只能让内行人耻笑。



ddd 冷静一下,过头了。
50 楼 ddd 2006-10-17  
Arath 写道


写成typedef void* handle_t就是自己给自己找麻烦。
要写也得typedef struct _tagPrivate *handle_t
你写那堆代码除了耍指针转化的技巧以外,没任何意义。

技巧和见识不是用来炫耀的,你认为这些我不会?那些os api clib不知道?没必要说的东西不说而已,纯粹炫耀自己只能让内行人耻笑。
49 楼 runes 2006-10-17  
Arath 写道
我可能说的不够明白,如果你拿某个特性来说C++自然要强于C,因为很多事情都是编译器来实现支持的而不是语法本身可以完成的,所以我所说的模拟是就实际的开发程序而言的.
Template、try catch等从语法角度当然用C做不了一模一样的,但是同样的算法实现的功能C可以做到.
btw, template可以自己写个简单的预编译器实现,只要有这个能力.


干脆asm 吧
48 楼 Arath 2006-10-17  
我可能说的不够明白,如果你拿某个特性来说C++自然要强于C,因为很多事情都是编译器来实现支持的而不是语法本身可以完成的,所以我所说的模拟是就实际的开发程序而言的.
Template、try catch等从语法角度当然用C做不了一模一样的,但是同样的算法实现的功能C可以做到.
btw, template可以自己写个简单的预编译器实现,只要有这个能力.
47 楼 runes 2006-10-17  
runes 写道
Arath 写道

就C和C++而言,实际上C++的东西C全部都可以模拟,而且会更有效率,但是这种模拟需要你完全了解C和C++的特性.


哦,是吗? 能否模拟一下这个编译期的计算看看 ?

template<int n>
struct Fa
{

  enum{v =Fa<n-1>::v*n};
};

template<>
struct Fa<0>
{
enum {v = 1};
}

int main()
{
  cout<<Fa(5)::v<<endl;
}


靠,好久不玩了,一不小心,还写错了,改正


int main()
{
  cout<<Fa<5>::v<<endl;
}

46 楼 runes 2006-10-17  
Arath 写道

就C和C++而言,实际上C++的东西C全部都可以模拟,而且会更有效率,但是这种模拟需要你完全了解C和C++的特性.


哦,是吗? 能否模拟一下这个编译期的计算看看 ?

template<int n>
struct Fa
{

  enum{v =Fa<n-1>::v*n};
};

template<>
struct Fa<0>
{
enum {v = 1};
}

int main()
{
  cout<<Fa(5)::v<<endl;
}
45 楼 Arath 2006-10-17  
有一个概念是混淆了,边界问题不简单的体现在封装上,在一个项目或者说程序上,封装只是一种控制边界的手段,而更主要的是在于开发人员的逻辑思维能力的控制以及对长久项目实践产生的经验的体现
封装这个在OO语言中大肆推广的概念几乎只要学过此类语言的人都用过,但是对于新手基本只是提留于概念阶段,所以开发的时候可能完全不再顾及这些.

就C和C++而言,实际上C++的东西C全部都可以模拟,而且会更有效率,但是这种模拟需要你完全了解C和C++的特性.
另外说一下DDD所提及的“绝对封装”(这个算是我第一次听到这个名词),在C的程序中,很多人会这么写:

test.h

typedef void* handle_t;

handle_t Initialize();
int Operation1(handle_t hObj);

--------------------------------------------
test.c

include "test.h"

typedef struct _tagPrivate *LPPRIVATE;
struct _tagPrivate
{
int a;
int b;
};


handle_t Initialize()
{
LPPRIVATE lpObj;

loObj = malloc(sizeof(_tagPrivate));

...

return (handle_t)lpObj;
}

int Operation1(handle_t hObj)
{
LPPRIVATE lpObj;

lpObj = (LPPRIVATE)hObj;

...

return 0;
}

对外只需要公布对应的.h file就可以, C Library和OS SDK很多都是如此封装的, 这点就是potian已经说明的.
这么做只是为了对外发布模块是用来保证内核的一些秘密,是一种封装方式,也是一种有效的边界控制手段.

相关推荐

    OC-添加新手引导页

    在iOS应用开发中,"OC-添加新手引导页"是一个...总之,OC实现新手引导页主要是利用UIScrollView的特性,结合`contentSize`和`contentOffset`,以及手势识别和视图动画,为用户提供一个友好且引人入胜的初次使用体验。

    软件测试新手学习宝典

    4. **测试方法**:分为黑盒测试(只关注输入和输出,不考虑内部结构)和白盒测试(考虑代码结构和逻辑)。灰盒测试则是两者的结合,部分了解内部工作原理。 5. **测试用例设计**:是测试过程中的核心环节,需要明确...

    Quartus-II.rar_FPGA altera quartus_quartus_quartus ii教程

    - **硬件调试**:支持JTAG接口的边界扫描测试,以及Altera的ChipScope集成逻辑分析器,方便硬件调试。 四、学习资源 "Quartus-II-设计基础.pdf"这份教程应该涵盖了Quartus II的基本操作和设计流程,包括项目设置、...

    入门级网页设计作业适合新手入门

    此外,测试是确保功能正常运行的重要步骤,包括边界条件测试和异常情况处理。 5. **用户体验**:除了技术实现,还需考虑用户体验。例如,提示信息应清晰易懂,错误处理要友好,操作反馈要及时。在功能5中,未选中...

    labview.doc

    此外,它还支持与其他编程语言(如C/C++、Python等)的集成,从而扩展了自身的功能边界。这种高度的可定制性和灵活性使得LabVIEW成为解决复杂问题的理想选择。 #### 七、易于学习和使用 对于新手来说,LabVIEW的...

    一个简单的贪吃蛇程序

    它的语法简洁明了,对新手友好,且功能强大,是学习游戏编程的理想选择。 在WinForm环境中开发贪吃蛇游戏,我们需要利用C#中的Windows Forms库来构建用户界面。WinForm提供了丰富的控件和事件处理机制,使得创建...

    初级食人花小游戏

    这些工具对于初学者来说非常友好,因为它们提供了丰富的文档和社区支持。通过这个项目,你可以学习到如何创建游戏对象、管理时间、处理用户输入以及应用基本的动画效果。 在解决游戏中的bug时,初学者会接触到调试...

    五子棋源码新手上传找点

    五子棋源码是一种编程实现的棋类游戏,主要由计算机科学中的算法和数据结构构成。五子棋,又称连珠、朱墨盘,是一种双人对弈的策略游戏,目标是...通过分析和学习这样的源码,开发者可以深入理解游戏逻辑和计算机思维。

    Ios ChineseChess

    例如,用户界面需要清晰地展示棋盘和棋子,同时提供友好的操作反馈;游戏规则解释可以帮助新手理解游戏;悔棋功能则需要记录每一步棋的状态;游戏结束的判定可能包括将死、困毙等多种情况;AI对弈模式则可能涉及到...

    贪吃蛇小游戏 java代码开发 源码 可运行

    在这个Java版本的贪吃蛇游戏中,开发者采用Java语言进行编程,这使得游戏可以跨平台运行,并且对新手友好,适合学习Java开发的初学者作为实践项目。 首先,我们要了解Java的基础知识。Java是一种面向对象的编程语言...

    俄罗斯方块Demo

    Java以其跨平台性、丰富的类库和强大的性能,成为许多游戏开发者的首选语言。在这个俄罗斯方块Demo中,我们可能使用了Java Swing或JavaFX库来创建图形用户界面(GUI),它们提供了丰富的组件和方法,使得开发者可以...

    wuziqi.rar_vc6.0

    6. **错误处理和调试**:在编写程序时,要充分考虑边界条件和异常情况,使用调试器如VC6.0自带的调试器来检查程序运行过程中的错误,确保程序的健壮性。 7. **代码优化**:虽然五子棋逻辑相对简单,但优化代码以...

    C# 扫雷游戏(注释详细 适合初学者)

    标签“C# 扫雷游戏(注释详细 适合初学者)”与标题一致,再次确认了该项目的主要特性:C#语言实现、详细的注释以及面向初学者的友好性。这表明项目开发者在设计时充分考虑到了教学和学习的需求,确保新手能从中受益...

    用js编写的飞机大战,注释都写着,小白也能看懂

    【描述】"这是用JavaScript写的飞机大战,一个比较简单的,图片资源都在压缩包里,注释也写了,大伙应该能看懂" 提示了游戏的实现基础和学习友好性。开发者使用JavaScript编写了一个简化的飞机大战游戏,这涉及到...

    snake贪食蛇游戏

    为了实现游戏逻辑,开发者需要编写一系列函数,包括初始化游戏、处理用户输入、更新蛇的位置、检测碰撞(包括蛇自撞和边界碰撞)、生成食物以及检查游戏结束条件等。在C++中,这些功能可以通过面向对象的设计实现,...

    godot-beginner-2d-platformer-1.1.0_game_godot_

    2. **碰撞检测**:Godot提供了多种碰撞形状,如CircleShape2D和PolygonShape2D,用于定义游戏对象的物理边界。这些形状与CollisionObject2D节点结合使用,可以检测游戏中的碰撞事件,从而实现障碍物的交互和平台间的...

    PLSQL Developer.rar 中文版

    它的主要目标是提供一个用户友好、高效且功能丰富的平台,以便于编写、测试和调试PL/SQL代码,这是Oracle数据库的主要编程语言。这款工具以其易用性、代码质量和生产力提升而受到广泛赞誉。 在PLSQL Developer中,...

Global site tag (gtag.js) - Google Analytics