信息隐藏与隐藏依赖关系

Mat*_*zol 5 abstraction information-hiding external-dependencies

过程(或函数,模块等)设计中有哪些常见的最佳实践,用于平衡信息隐藏的需求和过程接口中的适当抽象级别以及引入隐藏依赖项所固有的问题?

更具体地说,假设我编写了一个名为getEmployeePhoneNbr(employeeId)的过程.在内部,通过查询从employeeId键入的数据库表来实现该过程.我想隐藏这些实现细节,但现在该过程依赖于外部文件,如果环境发生变化则会阻碍其使用.

只要程序使用外部资源(文件,数据库等),就会发生同样的情况.以某种方式在程序中硬编码该资源的使用感觉是错误的,但我不确定替代方案是什么.

请注意,我不是使用面向对象的语言; 在可能的范围内,我最感兴趣的是那些广泛适用于任何类型语言的答案.

谢谢,马特

Dir*_*irk 0

您可以提供某种上下文/环境对象。说:

type Environment = record
      DatabaseHandle: ...;
      ...
   end;

   Employee = record
      ID: integer;
      Name: string;
      ...
   end;


function OpenEnvironment (var Env: Environment): boolean;
begin
   ...
end;

procedure CloseEnvironment (var Env: Environment);
begin
   ...
end;

function GetEmployeeById (var Env: Environment; ID: integer; var Employee: Employee): boolean;
begin
   ... load employee using the data source contained in environment ...
end;
Run Code Online (Sandbox Code Playgroud)

(伪帕斯卡)。优点是,您也可以使用环境结构来存储扩展错误信息和其他全局状态,这样就可以避免 PITA,即 Unixish errno或 Window 的GetLastError。这种方法的另一个优点是,所有 API 都可以重入,并且通过为每个线程使用专用环境,从而实现线程安全。

这种方法的缺点是,您必须向所有 API 传递一个附加参数。