user-0 提问: 问个模块封装的问题

回复:
user: user-1
content: 你给num2提供赋值函数，不给num1提供赋值函数，也是可以的。 但是有的人倾向于既然给num2提供了赋值函数，就给所有num提供赋值函数，这样看起来更整齐规范。  void Test_set_num1(Test_t *test, int value); void Test_set_num2(Test_t *test, int value); void Test_set_num3(Test_t *test, int value); void Test_set_num4(Test_t *test, int value);  这样把这个模块拿给别人用时，别人一看头文件就一目了然，清晰易懂。 其实这些很大程度上都是编码风格问题，不必过于纠结。 现在很多库都没有给出此类赋值函数，哪怕是限制对num1的赋值只允许在1-5之间，也仅仅是通过注释或文档来告知程序员。

user: user-2
content: 模块化就是希望其他模块在与之交互的时候减少耦合，提供这个接口给你用就是希望你不需要管这个接口的实现细节，你只管调用，即使以后改了实现细节（包括修改struct Test_t)你也可以不用修改你的代码，如果说不提供那么首先 你每个人在修改全局变量的时候你可能使用gTest.num1=value;这样的代码，这就要求 你的代码里面必须知道 Test_t的完整定义。而且一旦Test_t的细节被修改比如num1改成了num_m那么所有gTest.num1=value;的代码都需要被修改 而且这些代码都需要重新编译

user: user-3
content: 搞一个头文件，既让模块用，也让使用这个模块的源文件用。 /*********public.h goes here***************/ typedef struct __Test {     int num1;     int num2;     int num3;     int num4;     char str[10]; } Test_t;   extern Test_t  gTest;

user: user-0
content: 引用 4 楼 CharlesSimonyi 的回复:如果只是简单的直接赋值test->num1 = value;那么不需要，除非你要对它的赋值操作进行一些限制、干预等才需要这么用。 比如Test_t.num1的值只能在1-5之间，则限制对它的赋值：  bool Test_set_num1(Test_t *test, int value) { 	if (value < 1 || value > 5) 		return false; 	test->num1 = value; 	return true; }  又比如Test_t.num1表示毫秒，但是设置的时候用的单位是秒，则对它的赋值进行一些干预：  bool Test_set_num1(Test_t *test, int value) { 	test->num1 = value * 1000; }   当然也许是编程风格问题，整个项目中一些地方用到了这种赋值函数，则进行统一，对所有的结构体成员都提供赋值函数，这样更好看，规范。  比如 num1很简单，只是++或者-- 但num2有点限制  那么给num2写个接口访问，num1直接++或者--？

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:请牢记：源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要，重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。  To set a breakpoint when a variable changes value   From the Edit menu, click Breakpoints. Click the Data tab of the Breakpoints dialog box. In the Expression text box, type the name of the variable. Click OK to set the breakpoint. 引用 3 楼 zhao4zhong1 的回复:请牢记：源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要，重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。  To set a breakpoint when a variable changes value   From the Edit menu, click Breakpoints. Click the Data tab of the Breakpoints dialog box. In the Expression text box, type the name of the variable. Click OK to set the breakpoint. 你能像楼下的哪位一样吗？太抽象了

user: user-1
content: 如果只是简单的直接赋值test->num1 = value;那么不需要，除非你要对它的赋值操作进行一些限制、干预等才需要这么用。 比如Test_t.num1的值只能在1-5之间，则限制对它的赋值：  bool Test_set_num1(Test_t *test, int value) { 	if (value < 1 || value > 5) 		return false; 	test->num1 = value; 	return true; }  又比如Test_t.num1表示毫秒，但是设置的时候用的单位是秒，则对它的赋值进行一些干预：  bool Test_set_num1(Test_t *test, int value) { 	test->num1 = value * 1000; }   当然也许是编程风格问题，整个项目中一些地方用到了这种赋值函数，则进行统一，对所有的结构体成员都提供赋值函数，这样更好看，规范。

user: user-4
content: 请牢记：源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要，重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。  To set a breakpoint when a variable changes value   From the Edit menu, click Breakpoints. Click the Data tab of the Breakpoints dialog box. In the Expression text box, type the name of the variable. Click OK to set the breakpoint.

user: user-4
content: gTest.num1=value;

user: user-5
content: 用一个接口去访问是要好一些，比如以后你要修改的话，直接修改这个接口就行了 如果你直接使用gTest = value之类的，以后修改就麻烦了

user: user-4
content: 引用 5 楼 wangjun403 的回复:[quote=引用 3 楼 zhao4zhong1 的回复:] 请牢记：源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要，重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。  To set a breakpoint when a variable changes value   From the Edit menu, click Breakpoints. Click the Data tab of the Breakpoints dialog box. In the Expression text box, type the name of the variable. Click OK to set the breakpoint. 引用 3 楼 zhao4zhong1 的回复:请牢记：源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要，重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。  To set a breakpoint when a variable changes value   From the Edit menu, click Breakpoints. Click the Data tab of the Breakpoints dialog box. In the Expression text box, type the name of the variable. Click OK to set the breakpoint. 你能像楼下的哪位一样吗？太抽象了[/quote] 我的意思是没必要弄什么劳什子接口函数。 过早的优化是万恶之源。 真到了不知道在哪里全局变量被修改的那一天，还有数据改变断点帮助你。