如何理解软件开发规范性与灵活性

软件开发的规范性

规范性是指在软件开发时所必须遵循的约定、规范和流程,用于规范软件开发过程中的管理方法、设计方法、编码方法。很长一段时间,在软件工程学科中认为规范性来源于人为约定,但这种认识无法解释“约定”的本源,如为何要进行相关约定、相关约定的合理性。实际上,这些约定并非凭空产生,而是为了更加符合外部条件所作的规则和范围书面或口头上的汇总。

在编写任意一段代码时,都必须符合特定的规范,因为规范的本源来自于硬件、网络等外部环境。下面用一个表格来说明不同类型代码的规范来源。

代码

规范来源

机器语言

受到逻辑电路算法、计算机及相关设备的电路设计等方面的制约。每种机器语言只能应用于特定的计算机及设备。

汇编语言

受计算机结构、硬件设备组成和操作系统的制约,同时受到汇编语言组译器对语法的约束。汇编语言能够应用于同一硬件结构下的计算机及设备。

高级语言

受编译器、语法结构、设计方法的制约,高级语言能够运行在所有支持相应编译器的设备上。

此外,在软件的设计过程中面临更多的规范,例如互联网结构决定着一个网络应用程序所需要遵守的数据结构规范,当地的财务制度决定着一套财务管理软件的设计规范。在更高的层面,社会组织结构、分配方法将决定软件开发过程中的管理规范。


规范的隐藏

口头声明或书面约定的规范实际是为了软件开发中更清晰的理解规范,但更多规范则是被隐藏起来了。可以认为,规范的隐藏有两种途径,一种是人为故意的隐藏,另一种是无意识的隐藏。

人为故意隐藏

人为故意的隐藏通常是从技术手段出发,为了降低软件开发复杂性而设立的。例如使用微软的Visual Studio开发工具创建一个Windows窗口,设计器将自动添加相关的代码:


usingSystem.Windows.Forms;

public class Form1 : System.Windows.Forms.Form

……

软件开发人员很容易忽略掉语句中所应用函数库及所继承接口的重要性,而正是这些隐藏,使得创建的窗口均符合Windows规范,拥有标题栏、关闭按钮等控件。

对于某些能够在多种平台上编译的高级程序语言,编译器隐藏了符合各种平台的规范。例如C语言代码在Windows平台使用编译器编译,头几行的二进制代码均被设为:

00000000h:4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 ;

00000010h:B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 ;

00000020h:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;

用以表明所编译的文件为可执行文件,并且是运行于Windows平台的。如果程序不符合以上规范,则无法在Windows平台运行。相应的,Linux平台同样对可执行文件有相关规范,这些规范均为编译器所隐藏,而无需在代码中注意。

无意识隐藏

无意识隐藏的规范通常是所有开发人员均能够强迫被遵循的规范,不遵循这样的规范将会立即带来灾难性后果。例如在VC++语言所编写的一个程序中,需要打开一个文本文件,其代码如下:

using namespace System;

using namespace System::IO;

 

int main()

{

  String^ fileName = "textfile.txt";

  StreamReader^ din = File::OpenText(fileName);

  String^ str;

   intcount = 0;

  while ((str = din->ReadLine()) != nullptr)

   {

     count++;

     Console::WriteLine("line {0}: {1}", count, str );

   }

 

  return 0;

}

这段代码所遵循的规范除C++语言本身的规范外,还有隐藏的规范——必须先使用File类的OpenText方法打开文件,并将地址传递给StreamReader对象,才能读取文件内容。如果没有遵循该规范,程序将终止执行。

软件开发灵活性

软件开发中的灵活性通常是指管理方法和开发方法的灵活性,更细微的范围内则是指编码的灵活性。如果在解决某一问题时具备了多种可选择的方法,则可以认为开发过程拥有灵活性。

灵活性是在规范性框架内所实现的,可选择的方法无法超过规范所允许的范围内。例如,在使用原生态ANSI C语言编写通信程序时,只能使用其Socket相关函数实现相应功能。

但软件开发中的规范性与灵活性并不冲突,如果将软件开发视为有目的性的创作,则规范性是与之俱来的。

开发工具本身对规范做出了大量的隐藏工作,而软件开发者虽然难以洞见这些规范的存在,其工作确实建立在一个严格的规范下。而扩展灵活性的主要途径,是扩展规范。例如,在GNU C环境中通过引入GLIBC函数库对ANSI C规范进行扩展后,则有更多的函数用于实现通信功能。

在规范并不完善和并不细致时,软件开发的灵活性较差。软件开发的过程中,其规范是逐渐形成的,通过对规范的扩展,则灵活性相应提升。例如,当开发者因为需要更丰富的通信功能,而自己动手开发相关函数库,实际也是在着手建立相应的规范。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值