COBOL:使用段落和部分而不是子程序有什么好处?
COBOL: What is the benefit of using paragraphs and sections instead of subprograms?
使用段落和节来执行代码片段而不是使用子程序有什么好处?据我所知,段落和部分是危险的,因为它们有一个非直观的控制流,很容易被忽略并执行你从未打算执行的东西,并且没有变量(项目)范围,因此它鼓励一种风格一切都对其他一切可见的编程。汤很滑。
我读了很多书,但找不到任何与 paragraphs/sections 与子程序的比较优势相关的内容。我也在一些 COBOL 论坛上在线询问了一些人,但他们的回答是“这是个玩笑吗”或“去学习编程”(!!!)。
我不想讨论文体偏好,每个人都写他们的大脑工作方式,我只想知道,使用paragraphs/sections进行流量控制有什么好处吗?如,是否有任何 COBOL 操作可以通过使用 paragraphs/sections 仅 完成?或者它只是早期代码思考方式的残余?
因为我所知道的其他语言都没有模仿它,所以它要么有一些机械具体的必要原因存在于 COBOL 中,要么是 COBOL 人的风格偏好。有人可以告诉我发生了什么事吗?
这些问题很多...最重要的两个:
有没有只能使用paragraphs/sections才能完成的COBOL运算?
是的。可能不完整的列表:
USE
DECLARATIVES
中的语句只能应用于段落或部分。这些用于处理文件错误和异常。并非所有编译器都完全支持此 COBOL 标准功能。
- 分段(主要:仅部分加载到内存中的程序)仅适用于部分;但这将被视为“遗留功能”(至少我不知道人们实际上以这种方式明确使用它);有关此内容的更多详细信息,请参阅
- fall-through,许多其他语言都具有这种特性,带有一种
switch
语句(COBOL 的 EVALUATE
,它与常见的 switch
不同,但可以used similar 有明确的 break
并且没有 fall-through)
GO TO DEPENDING ON
(可以重新编码以实现与 EVALUATE
类似的效果,然后 PERFORM
,如果段落 预期 下降-through,这并不少见,然后会创建很多额外的代码)
GO TO
一般,特别好 - 旧的已过时的 ALTER
语句
PERFORM
语句,格式 1“越界”
- 当您将文件状态定义为
EXTERNAL
时,文件状态仅在程序之间共享,并且您通常希望文件状态仅限于单个程序
- 直到 COBOL85:
EXIT
语句(没有任何其他内容,实际上什么都不做,然后 CONTINUE
会)
使用段落和节来执行代码片段而不是使用子程序有什么好处?
- 共享数据(我猜你知道程序有
static
数据或其他(模块)在 functions/methods 和不同源代码文件之间共享的全局数据)
- 开销比
CALL
少得多
- 一致性:
- 你知道你的代码中有什么,你不知道另一个程序做了什么(或者至少:你不能保证它会在几年后完全一样地做同样的事情)
- 比 extend/change 更容易:将另一个变量(并删除它的一部分,改变它的大小)添加到
CALL USING
意味着你还必须调整被调用的程序 - 以及所有程序调用这个,即使你把完整的定义放在一个抄本里,这是非常合理的,这意味着你必须重新编译所有使用这个的程序
- a section/paragraph 始终可用(程序运行时已经加载),
CALL
ed 程序可能不可用或导致异常,例如因为无法加载因为它的参数已经改变
- 更少的代码
注意:虽然并非所有编译器都支持这一点,但当您使用一个源文件和多个程序定义(可能嵌套)并使用静态调用约定时,您可以解决几乎所有的运行时开销和一致性问题。这可能会给你一个“现代”的观点,你的目标是变量的范围限制,在程序中,当在 WORKING-STORAGE
中定义时是持久的(如局部静态),或者在 LINKAGE
或“ local-temporary" 在 LOCAL-STORAGE
.
时
一个应用程序的所有代码都应该在一个程序中吗?
[我添加这个是为了不导致错误的假设]当然不会!
使用子程序和用户定义的函数(甚至可能嵌套提供“范围内”和“共享”数据的选项)是一件好事,你有一个“功能边界”(例如:访问数据,用户界面,...)或具有“语言边界”的“现代”COBOL(例如:C/Java/whatever 的直接 CALL
),但它不是“jut用于将计数器限制到一个部分”——在这种情况下:要么定义一个变量,其状态不能保证在任何 PERFORM
之后可用,要么为 section/paragraph 定义一个;在这两种情况下,使用前缀告诉您这一点都是合理的。
使用“按边界分隔”的方法还可以解决“每个人都能看到所有内容的坏习惯”问题(在任何情况下仅适用于“同一程序中的所有 sections/paragraphs”)。
个人旁注:我只会使用属于“shop/team 规则”的段落(最好保持一致然后做不同的事情“只是因为它们更好”[仍然提供一个选项可能更改通用规则]) 或 GO TO
,我通常不使用它。
SECTION
s 和 EXIT SECTION
+ EXIT PERFORM [CYCLE]
(并且 很少 GOBACK
/EXIT PROGRAM
)几乎不需要段落。
非常简短的回答。子程序!!
子例程在调用例程的上下文中执行。优点二:无参数传递,易于创建。在某些语言中,子例程对于调用(调用)例程是私有的(并且是其一部分)(参见 BASIC 的各种方言)。
直接回答:Section 和 Paragraph 支持不同的编程思维方式。比调用子程序性能更高。支持叠加。 “fall thru”方面可能非常有用,是一个特性而不是一个缺点。根据您使用特定 COBOL 编译器执行的操作,它们可能是必需的。
另请参阅 PL/1、BAL/360、架构 360/370/...
作为资深的 Cobol 恐龙,我想说问好处不是正确的问题。我使用的段落(或部分)不同于子程序。在我看来,正确的问题是何时合理地使用它们。如果我可以打个比方,如果你有一只狗 java class,你会在它里面写 Dog-appropriate 方法。如果牵扯到一只猫,你可能需要一个帮手 class。在这种情况下,助手 class 是子程序。虽然,您可以改为在 Dog class 中编写 helper class 方法,但这将是糟糕的编码。
在任何其他语言中,我建议将自包含函数放入子例程中。
但是在 COBOL 中没有那么多。如果代码很可能在其他程序中使用,那么子程序是个好主意。否则不行!
原因是在编译时完全没有对数字类型或传递参数的存在进行任何检查。调用语句中的小错误会导致程序在 运行 次崩溃。限制 sub-routines 的使用并仔细检查调用代码是否有错误可使程序更可靠。
使用段落,任何类型不匹配都会在编译时被标记,或者会发生自动转换。
使用段落和节来执行代码片段而不是使用子程序有什么好处?据我所知,段落和部分是危险的,因为它们有一个非直观的控制流,很容易被忽略并执行你从未打算执行的东西,并且没有变量(项目)范围,因此它鼓励一种风格一切都对其他一切可见的编程。汤很滑。
我读了很多书,但找不到任何与 paragraphs/sections 与子程序的比较优势相关的内容。我也在一些 COBOL 论坛上在线询问了一些人,但他们的回答是“这是个玩笑吗”或“去学习编程”(!!!)。
我不想讨论文体偏好,每个人都写他们的大脑工作方式,我只想知道,使用paragraphs/sections进行流量控制有什么好处吗?如,是否有任何 COBOL 操作可以通过使用 paragraphs/sections 仅 完成?或者它只是早期代码思考方式的残余?
因为我所知道的其他语言都没有模仿它,所以它要么有一些机械具体的必要原因存在于 COBOL 中,要么是 COBOL 人的风格偏好。有人可以告诉我发生了什么事吗?
这些问题很多...最重要的两个:
有没有只能使用paragraphs/sections才能完成的COBOL运算?
是的。可能不完整的列表:
USE
DECLARATIVES
中的语句只能应用于段落或部分。这些用于处理文件错误和异常。并非所有编译器都完全支持此 COBOL 标准功能。- 分段(主要:仅部分加载到内存中的程序)仅适用于部分;但这将被视为“遗留功能”(至少我不知道人们实际上以这种方式明确使用它);有关此内容的更多详细信息,请参阅
- fall-through,许多其他语言都具有这种特性,带有一种
switch
语句(COBOL 的EVALUATE
,它与常见的switch
不同,但可以used similar 有明确的break
并且没有 fall-through) GO TO DEPENDING ON
(可以重新编码以实现与EVALUATE
类似的效果,然后PERFORM
,如果段落 预期 下降-through,这并不少见,然后会创建很多额外的代码)GO TO
一般,特别好 - 旧的已过时的ALTER
语句PERFORM
语句,格式 1“越界”- 当您将文件状态定义为
EXTERNAL
时,文件状态仅在程序之间共享,并且您通常希望文件状态仅限于单个程序 - 直到 COBOL85:
EXIT
语句(没有任何其他内容,实际上什么都不做,然后CONTINUE
会)
使用段落和节来执行代码片段而不是使用子程序有什么好处?
- 共享数据(我猜你知道程序有
static
数据或其他(模块)在 functions/methods 和不同源代码文件之间共享的全局数据) - 开销比
CALL
少得多 - 一致性:
- 你知道你的代码中有什么,你不知道另一个程序做了什么(或者至少:你不能保证它会在几年后完全一样地做同样的事情)
- 比 extend/change 更容易:将另一个变量(并删除它的一部分,改变它的大小)添加到
CALL USING
意味着你还必须调整被调用的程序 - 以及所有程序调用这个,即使你把完整的定义放在一个抄本里,这是非常合理的,这意味着你必须重新编译所有使用这个的程序 - a section/paragraph 始终可用(程序运行时已经加载),
CALL
ed 程序可能不可用或导致异常,例如因为无法加载因为它的参数已经改变
- 更少的代码
注意:虽然并非所有编译器都支持这一点,但当您使用一个源文件和多个程序定义(可能嵌套)并使用静态调用约定时,您可以解决几乎所有的运行时开销和一致性问题。这可能会给你一个“现代”的观点,你的目标是变量的范围限制,在程序中,当在 WORKING-STORAGE
中定义时是持久的(如局部静态),或者在 LINKAGE
或“ local-temporary" 在 LOCAL-STORAGE
.
一个应用程序的所有代码都应该在一个程序中吗?
[我添加这个是为了不导致错误的假设]当然不会!
使用子程序和用户定义的函数(甚至可能嵌套提供“范围内”和“共享”数据的选项)是一件好事,你有一个“功能边界”(例如:访问数据,用户界面,...)或具有“语言边界”的“现代”COBOL(例如:C/Java/whatever 的直接 CALL
),但它不是“jut用于将计数器限制到一个部分”——在这种情况下:要么定义一个变量,其状态不能保证在任何 PERFORM
之后可用,要么为 section/paragraph 定义一个;在这两种情况下,使用前缀告诉您这一点都是合理的。
使用“按边界分隔”的方法还可以解决“每个人都能看到所有内容的坏习惯”问题(在任何情况下仅适用于“同一程序中的所有 sections/paragraphs”)。
个人旁注:我只会使用属于“shop/team 规则”的段落(最好保持一致然后做不同的事情“只是因为它们更好”[仍然提供一个选项可能更改通用规则]) 或 GO TO
,我通常不使用它。
SECTION
s 和 EXIT SECTION
+ EXIT PERFORM [CYCLE]
(并且 很少 GOBACK
/EXIT PROGRAM
)几乎不需要段落。
非常简短的回答。子程序!! 子例程在调用例程的上下文中执行。优点二:无参数传递,易于创建。在某些语言中,子例程对于调用(调用)例程是私有的(并且是其一部分)(参见 BASIC 的各种方言)。 直接回答:Section 和 Paragraph 支持不同的编程思维方式。比调用子程序性能更高。支持叠加。 “fall thru”方面可能非常有用,是一个特性而不是一个缺点。根据您使用特定 COBOL 编译器执行的操作,它们可能是必需的。 另请参阅 PL/1、BAL/360、架构 360/370/...
作为资深的 Cobol 恐龙,我想说问好处不是正确的问题。我使用的段落(或部分)不同于子程序。在我看来,正确的问题是何时合理地使用它们。如果我可以打个比方,如果你有一只狗 java class,你会在它里面写 Dog-appropriate 方法。如果牵扯到一只猫,你可能需要一个帮手 class。在这种情况下,助手 class 是子程序。虽然,您可以改为在 Dog class 中编写 helper class 方法,但这将是糟糕的编码。
在任何其他语言中,我建议将自包含函数放入子例程中。
但是在 COBOL 中没有那么多。如果代码很可能在其他程序中使用,那么子程序是个好主意。否则不行!
原因是在编译时完全没有对数字类型或传递参数的存在进行任何检查。调用语句中的小错误会导致程序在 运行 次崩溃。限制 sub-routines 的使用并仔细检查调用代码是否有错误可使程序更可靠。
使用段落,任何类型不匹配都会在编译时被标记,或者会发生自动转换。