要使用公共方法创建JavaScript类,我会执行以下操作:
function Restaurant() {}
Restaurant.prototype.buy_food = function(){
// something here
}
Restaurant.prototype.use_restroom = function(){
// something here
}
Run Code Online (Sandbox Code Playgroud)
这样我班级的用户可以:
var restaurant = new Restaurant();
restaurant.buy_food();
restaurant.use_restroom();
Run Code Online (Sandbox Code Playgroud)
如何创建一个可由buy_food
和use_restroom
方法调用的私有方法,但不能由类的用户创建外部方法?
换句话说,我希望我的方法实现能够:
Restaurant.prototype.use_restroom = function() {
this.private_stuff();
}
Run Code Online (Sandbox Code Playgroud)
但这不应该奏效:
var r = new Restaurant();
r.private_stuff();
Run Code Online (Sandbox Code Playgroud)
我如何定义private_stuff
为私有方法,所以这两个都适用?
我已经阅读了Doug Crockford的几次写法,但看起来似乎不能通过公共方法调用"私有"方法,并且可以在外部调用"特权"方法.
我的类中有一组私有方法,我需要根据输入值动态调用一个.调用代码和目标方法都在同一个实例中.代码如下所示:
MethodInfo dynMethod = this.GetType().GetMethod("Draw_" + itemType);
dynMethod.Invoke(this, new object[] { methodParams });
Run Code Online (Sandbox Code Playgroud)
在这种情况下,GetMethod()
不会返回私有方法.什么BindingFlags
我需要提供以GetMethod()
使其能找到私有方法?
我有两个问题
最佳实践
这些是我能看到的选项,哪个最好?:
技术部分
有没有办法制作私有模块方法?
module Thing
def self.pub; puts "Public method"; end
private
def self.priv; puts "Private method"; end
end
Run Code Online (Sandbox Code Playgroud)
在private
中似乎有没有什么影响,我仍然可以调用Thing.priv
没有问题.
我正在编写一些单元测试.特别是我想测试一些私有方法.
到目前为止,我已经提出了使用.
#define private public
Run Code Online (Sandbox Code Playgroud)
但我对此并不满意,因为它会从单元测试的角度破坏所有封装.
您使用什么方法对私有方法进行单元测试.
对于Python中的私有成员和方法,我应该使用_foo(下划线)或__bar(双下划线)?
正如这里简洁描述的那样,在Java中覆盖私有方法是无效的,因为父类的私有方法是"自动最终的,并且从派生类中隐藏".我的问题主要是学术问题.
如何不允许父级的私有方法被"覆盖"(即,在子类中使用相同的签名独立实现),是不是违反封装?根据封装原则,子类无法访问或继承父级的私有方法.它是隐藏的.
那么,为什么要限制子类使用相同的名称/签名实现自己的方法呢?有没有一个很好的理论基础,或者这只是某种实用的解决方案?其他语言(C++或C#)对此有不同的规定吗?
你如何处理Haskell中的函数可见性和单元测试?
如果导出模块中的每个函数以便单元测试可以访问它们,则可能会冒其他人调用不应该在公共API中的函数.
我想到使用{-# LANGUAGE CPP #-}
然后用以下方法包围出口#ifdef
:
{-# LANGUAGE CPP #-}
module SomeModule
#ifndef TESTING
( export1
, export2
)
#endif
where
Run Code Online (Sandbox Code Playgroud)
有没有更好的办法?
是否存在命名我称之为" _Add
" 的私有方法的约定?我不是领先下划线的粉丝,但这是我的一个队友建议的.
public Vector Add(Vector vector) {
// check vector for null, and compare Length to vector.Length
return _Add(vector);
}
public static Vector Add(Vector vector1, Vector vector2) {
// check parameters for null, and compare Lengths
Vector returnVector = vector1.Clone()
return returnVector._Add(vector2);
}
private Vector _Add(Vector vector) {
for (int index = 0; index < Length; index++) {
this[index] += vector[index];
}
return this;
}
Run Code Online (Sandbox Code Playgroud) 我对单元测试很新,我有点困惑.
我试图在一个名为C++的类上进行单元测试(使用Boost单元测试框架)VariableImpl
.这是详细信息.
class Variable
{
public:
void UpdateStatistics (void) {
// compute mean based on m_val and update m_mean;
OtherClass::SendData (m_mean);
m_val.clear ();
}
virtual void RecordData (double) = 0;
protected:
std::vector<double> m_val;
private:
double m_mean;
};
class VariableImpl : public Variable
{
public:
virtual void RecordData (double d) {
// put data in m_val
}
};
Run Code Online (Sandbox Code Playgroud)
我的问题是如何检查均值是否正确计算?注意1)m_mean
受保护,2)UpdateStatistics
调用另一个类的方法,然后清除向量.
我能看到的唯一方法是添加一个getter(例如GetMean
),但我根本不喜欢这个解决方案,也不认为它是最优雅的.
我应该怎么做?
如果我要测试私有方法而不是私有变量,我该怎么办?
TIA,
JIR
我正在考试这StringTokenizer.java
门课,脑海里浮现出几个问题.
我注意到其他类使用的公共方法调用了一些完成所有工作的私有方法.现在,我知道OOD的原则之一就是尽可能多地私有化并隐藏所有实现细节.我不确定我是否完全理解这背后的逻辑.
我理解,将字段设为私有以防止将无效值存储在其中非常重要(这只是众多原因之一).然而,当谈到私人方法时,我不确定它们为何如此重要.
例如,在StringTokenizer
类的情况下,我们不能只将所有实现代码放在公共方法中吗?它如何对使用这些方法的类产生影响,因为这些方法的API(即调用这些公共方法的规则)将保持不变?我能想到为什么私有方法有用的唯一原因是它可以帮助你编写重复的代码.例如,如果所有公共方法都做了同样的事情,那么您可以声明一个执行此任务的私有方法,并且可以由公共方法使用.
其他问题,在私有方法中编写实现而不是公共方法有什么好处?
这是一个小例子:
public class Sum{
private int sum(int a, int b){
return a+b;
}
public int getSum(int a, int b){
return sum(a,b);
}
}
Run Code Online (Sandbox Code Playgroud)
VS ...
public class Sum{
public int getSum(int a, int b){
return a+b;
}
}
Run Code Online (Sandbox Code Playgroud)
第一个样本如何更有益?
java encapsulation private-methods stringtokenizer public-method
private-methods ×10
unit-testing ×3
c# ×2
c++ ×2
java ×2
.net ×1
coding-style ×1
haskell ×1
inheritance ×1
javascript ×1
oop ×1
private ×1
python ×1
reflection ×1
ruby ×1