过程(或函数,模块等)设计中有哪些常见的最佳实践,用于平衡信息隐藏的需求和过程接口中的适当抽象级别以及引入隐藏依赖项所固有的问题?
更具体地说,假设我编写了一个名为getEmployeePhoneNbr(employeeId)的过程.在内部,通过查询从employeeId键入的数据库表来实现该过程.我想隐藏这些实现细节,但现在该过程依赖于外部文件,如果环境发生变化则会阻碍其使用.
只要程序使用外部资源(文件,数据库等),就会发生同样的情况.以某种方式在程序中硬编码该资源的使用感觉是错误的,但我不确定替代方案是什么.
请注意,我不是使用面向对象的语言; 在可能的范围内,我最感兴趣的是那些广泛适用于任何类型语言的答案.
谢谢,马特
我正在尝试将 Spring 4.xx 迁移到 Spring boot,它依赖于外部 spring 2.5 jar 中的类。我已经进行了所有自动装配更改,下面是我的应用程序类
@SpringBootApplication
@EnableAutoConfiguration
@ComponentScan(basePackages = { "com.xyz" })
public class MainApiApplication {
public static void main(String[] args) {
SpringApplication.run(MainApiApplication.class, args);
}
}
Run Code Online (Sandbox Code Playgroud)
外部 jar 中的依赖类存在于 com.xyz.abc 包下,因此我将主应用程序类放置在 com.xyz 包下,并在同一包下添加了组件扫描
这是我的组件类,其依赖项已自动装配
@Component
public class ComponentClassA {
@Autowired
private ComponentClassB currencyService;
}
@Component
public class ComponentClassB {
@Autowired
private DependentClass depClass;
}
Run Code Online (Sandbox Code Playgroud)
DependentClass 是我在本地附加和构建的外部依赖 jar 中存在的类
构建应用程序时,所有文件的编译都很好,并且构建成功生成。但是当我启动应用程序时,出现以下错误
Field DependentClass in com.xyz.ComponentClassB required a bean of type 'com.xyz.common.util.DependentClass' that could not be found.
Run Code Online (Sandbox Code Playgroud)
我不明白找不到外部 …
我正在使用caldroid库进行日历活动,它工作正常.
但我需要改变它的风格.
所以我在这样的应用程序下添加了caldroid库(目录).

我改变了我的依赖关系
依赖{...编译'com.roomorama:caldroid:2.3.1'...}
至
依赖{...编译项目(':libraries:caldroid')...}
然后,它在调试模式下工作正常.
但由于此消息,我无法生成签名的APK.
错误:任务':app:validateExternalOverrideSigning'的执行失败.未找到用于签署配置'externalOverride'的密钥库文件/Users/xxxxxxx.android.keystore.
有关于此错误的解决方案吗?
android external-dependencies gradle caldroid android-studio-import
我当前的项目需要一个使用 Makefile 构建的库。我想在项目编译期间编译这个库;此功能是 FetchContent 的主要卖点,它与 CMake 依赖项配合得很好。尽管如此,我无法让它与 Makefile 一起使用,也找不到有关如何执行此操作的示例。
FetchContent_Declare(
make_lib
URL http://url/library_code.tar.gz
BUILD_COMMAND ${CMAKE_COMMAND} -E env make -j 8
BUILD_IN_SOURCE true
BINARY_DIR ""
)
FetchContent_GetProperties(make_lib)
if (NOT make_lib_POPULATED)
FetchContent_Populate(make_lib)
# here I would like to declare imported libraries:
add_library(make_lib::libA STATIC IMPORTED GLOBAL)
target_include_directories(make_lib::libA INTERFACE ${make_lib_SOURCE_DIR}/include)
set_property(TARGET make_lib::libA PROPERTY IMPORTED_LOCATION <path to "to be built" lib>)
endif()
Run Code Online (Sandbox Code Playgroud)
make?我有一个程序,我想只在一个CPU上运行,所以它不会占用太多的系统资源.问题是,它调用外部DLL,自动使用所有可用的CPU内核.我没有外部DLL的源代码.如何将DLL限制为仅使用一个CPU?
编辑:感谢您的帮助,这是我用来限制到一个CPU(Windows)的代码:
// Limit the process to only 1 thread so we don't chew up system resources
HANDLE ProcessHandle = GetCurrentProcess();
DWORD ProcessAffinityMask;
DWORD SystemAffinityMask;
if(GetProcessAffinityMask(ProcessHandle,&ProcessAffinityMask,&SystemAffinityMask)
&& SystemAffinityMask != 0)
{
// Limit to 1 thread by masking all but 1 bit of the system affinity mask
DWORD NewProcessAffinityMask = ((SystemAffinityMask-1) ^ SystemAffinityMask) & SystemAffinityMask;
SetProcessAffinityMask(ProcessHandle,NewProcessAffinityMask);
}
Run Code Online (Sandbox Code Playgroud)
编辑:结果Brannon设置流程优先级的方法更适合我想要的,这是为了防止流程咀嚼资源.这是代码(Windows):
// Make the process low priority so we don't chew up system resources
HANDLE ProcessHandle = GetCurrentProcess();
SetPriorityClass(ProcessHandle,BELOW_NORMAL_PRIORITY_CLASS);
Run Code Online (Sandbox Code Playgroud)