这是问题的一个完美示例:分类器gem打破了Rails.
**原始问题:**
作为一名安全专家,我担心的一件事是Ruby没有Java的包隐私.也就是说,这不是有效的Ruby:
public module Foo
public module Bar
# factory method for new Bar implementations
def self.new(...)
SimpleBarImplementation.new(...)
end
def baz
raise NotImplementedError.new('Implementing Classes MUST redefine #baz')
end
end
private class SimpleBarImplementation
include Bar
def baz
...
end
end
end
Run Code Online (Sandbox Code Playgroud)
能够防止Foo :: BarImpl的猴子修补真的很棒.这样,依赖图书馆的人就知道没人搞错了.想象一下,如果有人改变了你的MD5或SHA1的实现!我可以调用freeze这些类,但我必须在逐个类的基础上进行调试,而其他脚本可能会在我完成保护应用程序之前修改它们,如果我对加载顺序不是很谨慎的话.
Java为防御性编程提供了许多其他工具,其中许多工具在Ruby中是不可能的.(请参阅Josh Bloch的书以获得一个好名单.)这真的是一个问题吗?我应该停止抱怨并使用Ruby来实现轻量级的东西而不是希望"企业就绪"的解决方案吗?
(不,默认情况下,核心类没有在Ruby中冻结.见下文:)
require 'md5'
# => true
MD5.frozen?
# => false
Run Code Online (Sandbox Code Playgroud) 我想创建一个私有成员变量,即使对于拥有它的类也是私有的,并且只能由其getter和setter访问.我知道你可以用自动属性这样做
private int MyInt{ get; set;}
Run Code Online (Sandbox Code Playgroud)
但我希望能够修改getter和setter(例如)我可以记录字段设置的次数(即使是拥有的类).像这样的东西
private int MyInt
{
get{ return hiddenValue; }
set{ hiddenValue = value; Console.Out.WriteLine("MyInt has been set");}
}
Run Code Online (Sandbox Code Playgroud)
其中"hiddenValue"是只能在getter和setter中访问的成员.为什么?因为我是一个偏执的防守程序员,我甚至不相信自己:p.
这可能在C#中吗?如果是这样,语法是什么?
谢谢.
我想将propertyMap的副本添加到我的propertyMap:
public void addProperties(Map<String, Object> propertyMap) {
for (Map.Entry<String, Object> propertyEntry : propertyMap.entrySet()) {
this.propertyMap.put(propertyEntry.getKey(), propertyEntry.getValue());
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码没有这样做,但希望传达意图?
最好的方法是什么?我已经完成了一些关于"克隆","防御性复制","不可变对象",Collections.unmodifiable ......之类的阅读,但我比之前更加困惑.
我所需要的只是典型的SO风格,是一种更好的方式来表达我在代码片段中的意思.
我有一个看起来像这样的类(大大简化):
public class Foo
{
public enum Value
{
ValueOne,
ValueTwo
}
[XmlAttribute]
public Value Bar { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我从外部源接收 XML 文件。他们的文档指出,Foo 元素的 Bar 属性中只会有“ValueOne”或“ValueTwo”(他们不提供 XSD)。
所以,我像这样反序列化它:
var serializer = new XmlSerializer(typeof(Foo));
var xml = "<Foo Bar=\"ValueTwo\" />";
var reader = new StringReader(xml);
var foo = (Foo)serializer.Deserialize(reader);
Run Code Online (Sandbox Code Playgroud)
...这一切都有效。
然而,昨晚,他们向我发送了一些如下所示的 XML ,而我的反序列化失败了(理应如此):<Foo Bar="" />
有没有一种好的方法可以围绕这个进行防御性编码?理想情况下,我想说“如果这里出现问题,默认为 ValueOne”。我不想丢弃整个 XML 文件,因为单个属性被破坏了。
在switch语句的默认部分中断是否被认为是错误的编码?我正在阅读的一本书说它是可选的,但老师因使用它而被计算在内.
我正在编写一个代码,试图深入挖掘输入对象并找出位于该对象内的值.这是一个示例代码:
def GetThatValue(inObj):
if inObj:
level1 = inObj.GetBelowObject()
if level1:
level2 = level1.GetBelowObject()
if level2:
level3 = level2.GetBelowObject()
if level3:
return level3.GetBelowObject()
return None
Run Code Online (Sandbox Code Playgroud)
在很多情况下,我最终会得到这些"倾斜的条件".我怎么能避免这个?这看起来很脏,也是一种防御性的编程.
根据cppreference,assert将用作C++属性.
但是,已经有大量项目严重依赖于宏观assert,是否有任何不良影响?
我相当肯定我的教授会问我为什么选择将MVC用于我的网络应用程序.
说实话,我是MVC的新手.我读到了它,我正在使用它构建一个博客应用程序,我认为以这种方式处理问题是非常合乎逻辑的.
但为什么?O_O我画一个空白.如何建立一个N层应用程序更适合?
php model-view-controller defensive-programming zend-framework
我有一个对多线程应用程序不安全的对象(在几个方面),我想提供一个内部检查,以确保不会同时访问关键方法.
题
我应该使用哪些技术来检测和阻止多个线程访问我的类?
是否足以在消费者可能使用的所有方法,属性等上跟踪Thread.ID?
上的文档的QObject :: moveToThread()为Qt5.3解释说,moveToThread()如果对象具有一个父方法可能会失败.我如何在代码中检测到这个失败?
我意识到只是确保我的对象没有父对象可能已经足够好了,但作为防御性编程实践,我想测试可能失败的所有调用的返回值.
编辑:我想在一些答案之后强调一下,我完全清楚我可以在调用moveToThread之前测试父是否为0.我正在寻找可行的方法来根据经验确定moveToThread呼叫实际上是成功的.