我正在开始一个项目,我期望将包含大量的非Java代码(主要是shell和SQL脚本).
我仍然想用Maven管理这个项目.非Java源代码和Maven的最佳实践是什么?来源应该去哪里?在不同的生命周期阶段,他们会发生什么?任何指向或链接到更多信息将不胜感激.
最近我查看了一些C代码,发现了类似于以下内容:
struct foo {
int some_innocent_variables;
double some_big_array[VERY_LARGE_NUMBER];
}
Run Code Online (Sandbox Code Playgroud)
几乎完全是C中的一个新手,我几乎完全是一个新手,我是否正确地认为这个结构因使用数组成员而在使用空间方面效率极低?将此结构作为参数传递给函数时会发生什么?它是否完整地复制到堆栈中,包括完整的数组?
在大多数情况下,double *some_pointer改为更好吗?
pimpl习语的规范形式(来自Herb Sutter的"Exceptional C++")如下:
class X
{
public:
/* ... public members ... */
protected:
/* ... protected members? ... */
private:
/* ... private members? ... */
struct XImpl;
XImpl* pimpl_; // opaque pointer to
// forward-declared class
};
Run Code Online (Sandbox Code Playgroud)
我的问题是,为什么XImpl声明为结构而不是类?
在Weblogic 10.3中,如何将远程EJB从一个EAR注入到另一个EAR的无状态bean中,两个EAR是否都部署在同一个容器中?理想情况下,我想尽可能多地使用注释.
所以假设我有以下界面:
public interface HelloService {
public String hello();
}
Run Code Online (Sandbox Code Playgroud)
由以下EJB实现:
@Stateless
@Remote
public class HelloServiceBean implements HelloService {
public String hello() {
return "hello";
}
}
Run Code Online (Sandbox Code Playgroud)
假设它们已经打包并部署在中server.ear.现在client.ear,我有以下内容:
@Stateless
public class HelloClientBean {
@EJB
HelloService helloService;
// other methods...
}
Run Code Online (Sandbox Code Playgroud)
我需要添加什么才能让Weblogic在HelloClientBeanin client.ear和HelloServiceBeanin 之间正确地计算出布线server.ear?热烈欢迎官方文件和/或书籍的指示.
在Scala(2.7)中,如果我有这个功能:
def foo(args: Array[String]) =
for (arg <- args) println(arg)
Run Code Online (Sandbox Code Playgroud)
如果我现在尝试定义以下内容:
def bar(args: String*) = foo(args)
Run Code Online (Sandbox Code Playgroud)
然后编译器抱怨:
<console>:5: error: type mismatch;
found : String*
required: Array[String]
def bar(args: String*) = foo(args)
^
Run Code Online (Sandbox Code Playgroud)
我不明白这个错误,因为编程Scala书中指出args内部函数的类型bar实际上是Array[String].我怎么能用重复的参数写这样的包装函数?
我知道原则上可以将C或MATLAB等过程语言转换为面向对象的语言.这个问题在这里和这里都得到了很好的讨论.
我在这些讨论及其中的参考文献中找不到的是对是否应该应用这些原则的说明.这样做有什么具体的东西可以获得吗?这显然是可能的,但建议这样做吗?开源项目中是否有任何例子,这种做法带来了明显的优势?
澄清
也许一个例子是有序的.
我继承了一些实现一些机器学习算法的MATLAB代码.building_model根据传递的标志,基本上只有一个函数可以训练模型或使用它来预测未来值:
building_model('train', ...) % ... stands for the data with which the model is trained
Run Code Online (Sandbox Code Playgroud)
和
value = building_model('predict')
Run Code Online (Sandbox Code Playgroud)
模型本身是用MATLAB持久变量实现的building_model.
我已经building_model分成两个功能,一个用于训练,一个用于预测.以前用作持久变量的模型现在被外部化了,可以这么说:
model = new_model()
model = model_train(model, ...)
prediction = model_predict(model)
Run Code Online (Sandbox Code Playgroud)
粗略地说,就我可以在MATLAB中管理模拟OOP的某些功能而言.我的建筑模型模块现任很像一类,有一个构造函数和两个方法model_train和model_predict.我已经实现了一定程度的封装(虽然没有什么可以阻止调用者摆弄内部的内容model),并且原则上也可以容纳多态性.作为额外的奖励,我几乎免费获得命令/查询分离,因为model_predict不返回model,因此可能不会改变model.
(精明的读者会指出MATLAB已经有一个面向对象的系统.由于各种原因,包括性能和与旧版本的兼容性,我不能使用它.)
我可以想象在C中有一个类似的机制,你可以设计一些数据结构和编写函数,其第一个参数是该数据结构的一个实例.
我想知道的是,我可以在多大程度上推动这种编程方式?这是一种普遍接受的模式(在那里,我说过这个词)?我应该注意哪些性能问题?
language-agnostic oop paradigms design-patterns design-principles
我们正在使用C语言中的数字例程库.我们还不确定是否可以使用单精度(float)或double(double),因此我们将类型定义SP为别名,直到我们决定:
typedef float SP;
Run Code Online (Sandbox Code Playgroud)
当我们运行我们的单元测试时,它们都会通过我的机器(一个64位的Ubuntu),但它们在我的同事(一个错误地安装在64位机器上的32位Ubuntu)上失败了.
使用Git的bisect命令,我们发现确切的差异开始在他的机器和我的机器之间产生不同的结果:
-typedef double SP;
+typedef float SP;
Run Code Online (Sandbox Code Playgroud)
换句话说,从双精度到单精度会在我们的机器上产生数值上不同的结果(在最坏情况下约为1e-3相对差异).
我们相当肯定,我们永远不会将无符号的整数与负数签名的整数进行比较.
为什么数字例程库会在32位操作系统和64位系统上产生不同的结果?
澄清
我担心我可能不够清楚:我们有2f3f671使用双精度的Git提交,并且单元测试在两台机器上同样通过.然后我们有git的承诺46f2ba,我们改为单精度,这里的测试仍然通过64位的计算机上,但不能在32位机器上.
"数字食谱"的作者给出了Ch.图10是模拟退火算法的实施方案,其将"经典"模拟退火与Nelder-Mead下坡单纯形法结合.
我真正喜欢这个算法的方法是当退火温度达到0时,它会收敛到经典的下坡搜索.但是,我从来没有找到任何其他参考这个算法; 它是模拟退火算法的安全,成熟变体(即生产就绪)还是应该被视为投入本书的实验性想法?
我正在研究一个C++库,其中一个函数返回一个(新分配的)指向一个双精度数组的指针.API声明调用者有责任释放内存.
但是,C++库曾经在C中实现,并且有问题的函数会分配内存malloc().它还假定调用者将释放该内存free().
我可以通过电话安全地替换malloc()呼叫new吗?现有的客户端代码(free()如果我这样做会使用中断吗?到目前为止我能找到的是官方文档free(),其中说明了这一点
如果ptr没有指向使用[malloc,calloc或realloc]分配的内存块,则会导致未定义的行为.
但我相信这是在C++与自己的分配运算符一起出现之前编写的.