Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Java到C代码组织的转换_Java_C_Code Organization_Modularity - Fatal编程技术网

从Java到C代码组织的转换

从Java到C代码组织的转换,java,c,code-organization,modularity,Java,C,Code Organization,Modularity,当用Java编程时,我显然将相关代码保存在类中,组织类结构、层次结构等,以最大限度地实现代码重用 现在我开始使用C语言,对于以模块化的方式组织C代码的最佳方式有点困惑。显然,我知道头文件和源文件,但在C语言中实现代码重用最大化时,我有点不知所措 那么,人们如何用一种显然不支持OOP的语言(如C)来组织代码呢?这两种语言的不同之处在于java更为现代,而且是为OOP设计的 C语言更古老,是一种前自然语言。由于语言不同,我们编程的方式通常不同,布局也不同 C程序在.h中有头文件(和函数原型),在.C

当用Java编程时,我显然将相关代码保存在类中,组织类结构、层次结构等,以最大限度地实现代码重用

现在我开始使用C语言,对于以模块化的方式组织C代码的最佳方式有点困惑。显然,我知道头文件和源文件,但在C语言中实现代码重用最大化时,我有点不知所措


那么,人们如何用一种显然不支持OOP的语言(如C)来组织代码呢?

这两种语言的不同之处在于java更为现代,而且是为OOP设计的

C语言更古老,是一种前自然语言。由于语言不同,我们编程的方式通常不同,布局也不同

C程序在.h中有头文件(和函数原型),在.C文件中有函数代码

在模块化方面,您仍然可以遵循与java类似的模式来分割代码。一般的经验法则是一个文件应该做一件事,即string_parser.c应该只处理字符串解析。列表分拣机。c应处理列表分拣等

在代码重用方面,像“实用程序”文件这样的东西很好,因此可重用的有用代码可以放在一个C文件中,并在需要的地方包括在内。您永远不必复制C语言中的代码,因此,如果您发现自己使用了复制/粘贴功能,请将其放在一个中心化的文件中,并将其包含在多个位置

编写通用函数!保持函数的简单性和开放性,使它们不那么具体,这样就可以重用函数

我的建议是记住Java代码布局知识,但也要检查好的C指南


一般来说,良好的项目设计将帮助您确定项目的文件布局/结构。

谈到
Java
C
之间的主要风格差异,我想说这不是OOP缺失

一般来说,把C看作“只是旧的”语言是错误的。它是完全不同的语言,其性质也完全不同。假设Java在处理低级应用程序方面并不是那么完美,而且总是这样,因为Java旨在为应用程序开发人员提供安全性。C没有这样的可用性,但它赋予你更多的控制权,并赋予你适当的责任

与Java相比,
C
的主要优点是接口和实现之间的距离。举例说明:当你们有标题时,实际上你们有接口概念,它实际上是接口。您可以基于标题链接实现相同接口的完全不同的模块。嗯,你将无法用语言控制这些东西:-)而且它们真的不安全。感受与Java的不同

在C中,您可以基于带有指向方法实现的函数类型指针的结构实现OOP方法。此外,通过这种方式,您会收到类似于“运行时灵活OOP”的消息,因为此绑定是初始化的主题,甚至是运行时更改的主题。它离反射很近。。。但要快得多,危险得多

如果您想寻找好的C最佳实践,请查看Linux内核源代码。这段代码是根据现代C最佳实践发展而来的,可能是高质量的大型C项目的最佳例证


希望这会有所帮助。

我倾向于这样想:

  • java类的C等价物应该在一对.C/.h文件中。它的数据(无论是私有的还是公共的)包含在结构中(最好只在.c文件中声明)。在.h文件中声明的每个函数都有一个指向其结构的指针作为参数。.h文件只需要包含结构声明
  • java包的C等价性只能通过在不同目录中定位文件来实现。但是,由于只有一个全局名称空间,仍然必须在每个非静态函数和类型前面加上唯一的前缀,例如XXXNAME_yyName_ZZZNAME_FunctionName(),其中XXXNAME是公司名称,yyName是产品或库的名称,ZZZNAME是产品/库中的子包的名称。我注意到,在现实生活中,使用公司名称并不常见,如果产品/库“小”,也不会使用
  • (单个)通过将“基类”的结构作为“子类”结构的第一个元素,可以轻松实现继承。但是,如果不公开整个结构,则很难将继承结构公开给客户端
示例头文件:

struct CARLIB_Car_s;

void CARLIB_Car_Drive(struct CARLIB_Car_s *pCar, uint16_t KiloMeters);
示例源文件:

struct CARLIB_Car_s {
   uint16_t FuelLeft;
};

void CARLIB_Car_Drive(struct CARLIB_Car_s *pCar)
{
  // ...
}

我确实看到了上面的文章,但我认为这个问题是有道理的,因为我正在询问一种用于Java等语言的代码组织技术。过渡性提示。是的,对不起,这是一个漫长的夜晚。@FaddishWorm我想这就是你的意思。长夜啊?我知道这一点。@Vision决策是一个重要的一周,为了摆脱咖啡因含量高的状态,在堆栈上冷藏:P