gx works2编程教程_教程2-如何编程

本文探讨了程序设计中规范的重要性和理解,以gx works2编程为例,强调了程序员需要深入阅读和理解规范,指出规范不清晰可能导致的后果。文章还提到了设计阶段、编码标准和测试在编程过程中的作用,特别是极限测试和同行评审的价值,旨在提高代码质量和可维护性。

gx works2编程教程

张贴者

万发

上一教程讨论

什么是编程 ,我们试图实现什么,答案是构成有效程序的指令列表。 现在,我们将讨论如何着手这样做。

每个程序都以一个规范开头,这可能是来自最新客户的几百页文档,也可能是来自教授的一小段文字,介于两者之间。

规范非常重要,规范编写是程序设计的一个完整分支,在此不做讨论。 重要的是,否则该规范是正确的,要使用众所周知的计算格言,将垃圾放入垃圾中。

几年前发生的一个例子是,我收到了一份Windows软件的10-20页规范。 规范似乎很合理,所以我开始研究它,我唯一注意到的是尽管没有包含诸如以下子菜单项的事实,但在程序菜单中为第一个下拉菜单指定了除“文件”之外的其他单词。通常在Windows程序的“文件”菜单上找到“打开”,“保存”,“另存为”等。 我向客户提出了这一点,并询问他们是否要考虑对明显是“文件”菜单的此菜单使用“文件”一词。

我得到他们正在考虑的答复,他们预计将花费大约2周的时间,而与此同时不采取任何措施。 现在我想起我还年轻,经验不足和愤世嫉俗,那时我以为他们不可能对规范进行太多更改,并且由于我无能为力,因此我继续进行研究,但前提是尽管需要修改的许多工作将是相关且有用的。 当我在两周后获得新规范时,这是一个错误,其中没有任何一件东西与我收到的原始规范有相似之处。 我必须完全重新开始。 这是规范错误的一种情况,以至于有关用户界面中单个单词的问题导致整个规范的完整更改。 我不得不说,对我来说,这是一个独特的例子,自那以来我再也没有一个错误的说明。

作为程序员,规范不是您的责任,请记住您的责任是创建计算机将遵循的指令列表。 但是,您有责任阅读和理解该规范。 如果规格不清楚,不合逻辑或不完整,则应在规范中提出问题。 遵循以下规范:

该程序将允许用户输入3个整数值。 确认前两个值的总和小于第三个值后,程序将计算三角形的面积,该三角形的边长为3个输入的长度。 然后它将为用户在屏幕上打印该区域。

那么,这有什么问题呢? 停下来想一想。

除其他错误外,您可能已经发现此规范不完整,因为它没有说明如果输入的前两个值的总和大于或等于第三个值应该怎么办,这是不合逻辑的,因为如果条件是输入的前两个值小于第三个值,则该值不能构成三角形的边长,因此无法进行面积计算,最后尚不清楚,因为它没有明确说明一旦打印了该值该怎么办对于用户区域,大概退出。

规范很少是完美的,并且在最终达成一致之前,要经历几次迭代并不少见。

因此,我们现在已经阅读了该规范,程序员现在有责任确保他们拥有实现该规范所需的所有信息。 请注意,规范将告诉您必须发生的事情,而不一定是如何实现的,因此,这是确保您知道如何解决上一个教程中讨论的问题的关键。 在此处进行网上或已知标准和书籍方面的研究,以确保您知道如何解决问题。

找到了解决问题的方法之后,您就可以开始编码了,对吗? 现在是进行一些程序设计的时候了,现在需要多少设计以及设计的存储位置取决于程序的复杂性,用户的经验和程序的目的,这是错误的。 例如,由经验丰富的程序员作为临时项目工具编写的简单程序(即仅使用一两天)可能只需要对程序设计进行一点思考。 由经验不同的程序员团队编写的任何复杂程序都需要书面设计。

设计中的信息量是一个可移动的盛宴,从对程序将如何组合的一般描述到列出程序中的功能以及目的的高度详细的设计不等。 有许多可用的设计方法,例如伪编码,UML,YORDON,SDL,您可以选择使用什么。

设计似乎是一个不必要的阶段,我曾让一些经理相信这一点,并坚持认为编程是从没有设计阶段开始的,但是,花在设计上的每一小时,您可能会节省一个多小时的编程时间,以进行更改。

一旦有了设计,就不会陷入僵局。 它只是给出有关程序编写方式的最新想法。 我认为我没有看到一个最终代码与初始设计完全匹配的项目。 随着规格的变化,设计也会随之变化。 但是拥有它将为从那里开始编码提供明确的位置,并最终将导致更好的可维护性代码。

设计完成后,就可以开始编码了。 但是,在这一点上值得一提的是编码标准。 您使用的编码标准取决于负责您所从事项目的人员。 这可能是您,您的老师,您的经理或您工作的公司。 编码标准很重要,尤其是在团队合作中,因为它指定了将用于代码的布局以及不使用的语言的任何功能(例如,在我从事过的许多嵌入式项目中)内存非常有限,编码标准已指定不得使用malloc。 拥有编码标准的原因主要是再次维护。 每个人都使用相同的样式来编写代码,这意味着每个人都可以更轻松地阅读彼此的代码。

最后,一旦程序完成,您就可以开始测试了。 现在这是一个问题,您能否定义一个成功的测试? (在这里思考)

答案在某种程度上取决于测试的目的,但是在这一点上,我看到的软件的第一个版本最好的定义是成功的测试失败了,并且突出了可以修复的错误。 这样做的合理性是,在任何规模较大的项目中,第一次正确编写该代码的可能性都非常接近于0。因此,如果它存在错误,则所有通过的测试都不能突出显示它们。

成功的测试并不意味着该软件没有漏洞,仅表示您的测试不够广泛。

测试不必涉及运行任何代码。 同行评审的源代码也是一种很好的测试形式。 您可以在这里坐在一张桌子旁,逐行检查代码,以检查是否存在逻辑错误,符合标准和编程错误。 实际上,这可能会引发错误,而这些错误是通过运行软件进行测试而无法发现的。

实际上,我可以编写与测试一样多的测试内容,因此将大部分主题留给另一个教程,但是我会这样说。 如果您的教授给出了一个示例输入和输出的作业,仅用这些值进行测试是不够的。 您可以打赌,您的教授将拥有一套不同的测试值来测试您的程序,这是您的底钱。

在决定如何测试某些代码时,您应该查找极限值并测试极限值和介于两者之间的一些值。 以这个功能为例


short Example(short input)
{
    long output; 
    if (input < 0 || 1000 < input)
    {
        return -1;
    }
    output = (long)input * (1000L – (long)input) * 370L; 
    output /= 100000; 
   return (short)output;
} 
此功能的规格如下。

函数Example使用单个short参数。 如果此参数的值在0 <= parameter <= 1000范围内,则该函数将返回相同范围内的值,否则它将返回-1。

您应该使用哪些测试值? (在这里思考)

记住我说的话,至少需要测试参数的限制。 此函数的参数有2个限制,分别是0和1000,这是您需要测试的2个值。 嗯,不,这样的限制定义了两个值,分别在限制内和限制外,因此您需要测试-1、0、1000、1001,这并不是因为短参数本身有一些限制,限制中定义的最小值和最大值。h SHRT_MIN(-32768)和SHRT_MAX(32767)。 因此,要测试的完整限制是

SHRT_MIN

-1

0

1000

1001

SHRT_MAX

另外,正如我所说,您应该检查范围中间的一些数字,随机说

-12378

-7342

-56

45

246

943

1873年

7324

23487

实际上,这是一个相当简单的函数,一个2字节的short仅有65536个可能的值,因此在这种情况下检查每个输入值是完全可行的,但是在许多情况下,由于太多的值无法检查每个输入值。 在这种情况下,能够确定极限是一个重要的工具。

这里总结一下是编写程序的过程图


          -------------------
          |                 |
  ------->|  Specification  |
 |        |                 |
 |        -------------------
 |                 |
 |                 |
 |                 v
 |        -------------------
 |        |     Design      |
 |<-------|   Including     |<-----------
 |        | working out how |            |
 |        -------------------            |
Specification      |                     |
Error Found        |                     |
 |                 v                     |
 |        -------------------            |
 |        |                 |----------->|
 |<-------|   Programming   |            |
 |        |                 |<---       Design
 |        -------------------    |    Flaw Found
 |                 |             |       |
 |                 |          Bug Found  |
 |                 v             |       |
 |        -------------------    |       |
 |        |                 |----        |
  --------|    Testing      |------------ 
          |                 |
          ------------------- 
正如您在任何阶段看到的那样,您可以返回上一个阶段,并且经常这样做。

对于那些想要金星的人,这里有一些问题需要回答

  1. 函数示例提供了一个非常粗糙的实现?
  2. 在函数示例中,为什么变量输出很长?
  3. 为什么在使用之前将参数输入强制转换为很长的时间?
  4. 为什么以下对函数示例的不良测试例程? 你能纠正吗?
    
    int main(int argc, char **argp)
    {
        short in=SHRT_MIN;
        short out;
        int good = 1; 
        for(in=SHRT_MIN; in<=SHRT_MAX; in++)
        {
            out = Example(in); 
            if (in < 0 || in > 1000)
            {
                if (out != -1)
                {
                    printf("ERROR: Example(%d) = %d, should be -1\n", in, out);
                    good = 0;
                }
            }
            else if (out < 0 || out > 1000)
            {
                printf("ERROR: Example(%d) = %d, should be in the range 0 - 1000\n", in, out);
                good = 0;
            }
        } 
        if (good == 1)
        {
            printf("No errors detected\n");
        }
    } 

翻译自: https://bytes.com/topic/c/insights/738833-tutorial-2-how-program

gx works2编程教程

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值