Closed. This question is opinion-based。它当前不接受答案。












想改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。

3年前关闭。



Improve this question





这是我之前的帖子的后续内容:

Ada: Understanding private types and understanding packaging

Rectangular类型的实现是使用一个实现实现的,即Rectangular_Method_1,并且此实现需要规范文件和主体文件。

如果我们想为用户提供另一个实现Rectangular_Method_2,则可以将主文件rectangular_Form.ads更改为

-- with Rectangular_Method_1;
-- package Rectangular_Form renames Rectangular_Method_1;
with Rectangular_Method_2;
package Rectangular_Form renames Rectangular_Method_2;


问题


这是软件工程中允许其他实现的正确方法,因为对于不同的实现,测试文件test_rectangular_form.adb保持相同?
如果我们创建第二个实现Rectangular_Method_2,除了该新实现的强制性新主体之外,是否需要创建单独的规范文件?但是,在新的实现中需要为Vector_Basis_rSet_HorzGet_Horz等提供相同的过程/功能,以便我们可以在test_rectangular_form.adb中调用它们。


谢谢...

最佳答案

如果使用GNAT,则可以将GPR文件用于项目。您可以在其中更改特定软件包的文件名,例如:

for Specification (Rectangular_Form) use "Rectangular_Method_1.ads";
for Implementation (Rectangular_Form) use "Rectangular_Method_1.adb";


您甚至可以根据环境变量进行设置。

如果规格文件的外观都相同,则可以使用Rectangular_Form.ads,并且只能使用上方的Implementation行。

GPR文件示例如下所示:

project Example is

   type Methods is ("normal", "something_else");
   Method : Methods := external ("METHOD", "normal");

   package Naming is
      case Method is
         when "normal" =>
            for Implementation ("Example") use "example_normal.adb";
         when "something_else" =>
            for Implementation ("Example") use "example_something.adb";
      end case;
   end Naming;

end Example;


然后,您可以根据您的gnatmake -P example.gpr变量使用METHOD对其进行编译,或者对gnatmake使用-XMETHOD=...参数,或者仅使用提供的默认值。

example_*.adb应该全部包含包Example的主体,而不是Example_Normal等。

08-27 18:00