第三章 TinyOS编程语言nesC

第二节 组件定义

    例3.4:

    configuration MainC{

    provides interface Boot;

    uses interface Init as SoftwareInit;

    }

    组件的规范部分可以为空,表明组件是顶层应用配件,如PowerupAppC。

    3.2.2  关键字as

    细心的读者会发现,上面MainC配件规范部分的第二条语句中引入了一个新的关键字as。关键字as的作用是为接口定义一个别名。这里是为接口Init定义了一个别名SoftwareInit,表明使用该接口对软件进行初始化。从这个角度来看,使用as可以提高程序的可读性。

    除了上述情况外,还有一种情况要求在组件规范中必须使用关键字as。

    在组件规范中可能需要多次提供或使用同一接口,此时必须使用关键字as来区分同一类型接口的多个实例。例如,配件LedsC通过Leds接口提供了三个二极管的抽象。LedsC是一个配件,没有可执行代码,它将二极管模块LedsP连接到更为底层的能够激励二极管的组件上。模块LedsP的规范见例3.5,通过使用关键字as,为接口GeneralIO的三个实例定义了不同的别名。总之,在组件规范中,必须确保每个接口实例都具有唯一的名字,才能保证配件实现组件连接的过程中不至于产生混乱。在模块LedsP后的“@”代表属性,详见3.7.5小节。

    例3.5:模块LedsP的规范

    module LedsP  @safe(){

    provides{

    interface Init;

    interface Leds:

      }

    uses{

    interface GeneralIO as Led0;

    interface GeneralIO as Led1;

    interface GeneralIO as Led2;

      }

    }

    事实上,接口声明中已经隐性地使用了as。下述两条nesC语句中,第一条语句实际上是第二条语句的缩写。

    uses interface Leds;

    uses interface Leds as Leds;

    关键字as不仅可以应用于组件规范中为接口设定别名,还可以应用于配件实现部分,为声明的组件设定别名。他们的作用类似于变量名字和函数名字。有效使用关键字as,会大大提高程序代码的可读性。

    3.2.3  将接口分成组

    如果组件规范中提供多个接口或者使用多个接口,可以将提供或者使用的多个接口分成组。上面提到的模块LedsP是一个典型的例子,使用大括号将提供的Init接口和Leds接口括起来,并用关键字provides标识,将使用的Led0、Led1和Led2接口括起来,用关键字uses标识。这只是一种编程风格而已,目的是使得代码更加清晰易读。也就是说,例3.6中的两个版本是等价的,这两种写法在语法和代码执行效率方面没有差异。