我一直注意到静态类在用于存储全局信息方面在SO上获得了很多不好的代表.(而且全局变量一般都被嘲笑)我只想知道下面的例子有什么好的选择......
我正在开发一个WPF应用程序,并且根据当前登录用户的ID过滤了从我的数据库中检索到的数据的许多视图.同样,我的应用中的某些点应该只能被视为"管理员"的用户访问.
我目前正在静态类中存储loggedInUserId和isAdmin bool.
我的应用程序的各个部分需要这些信息,我想知道为什么它在这种情况下不理想,以及替代品是什么.起床和跑步似乎非常方便.
我唯一可以想到的替代方法是使用IoC容器将Singleton实例注入需要此全局信息的类中,然后类可以通过其接口与之通信.然而,这是否过度/导致我陷入分析瘫痪?
提前感谢您的任何见解.
更新
因此,我倾向于通过IoC进行依赖注入,因为它可以更好地提供可测试性,因为我可以交换一个服务,如果需要,可以使用模拟提供"全局"信息.我想剩下的是注入的对象是单身还是静态.:-)
如果等待查看是否还有其他讨论,请问问Mark的答案.我不认为这是正确的方式.我只是想看到一些可以启发我的讨论,因为在没有任何建设性的替代方案的情况下,似乎有很多"这是坏的""很糟糕"的陈述在一些类似的问题上.
更新#2 所以我选择了Robert的答案,因为它是一个很好的选择(我认为替代方案是一个奇怪的词,可能是One True Way,因为它是内置于框架中).它并没有强迫我创建一个静态类/单例(尽管它是线程静态的).
唯一让我感到好奇的是,如果我必须存储的"全局"数据与用户身份验证无关,那将如何处理.
哪个STL容器最适合我的需求?我基本上有一个10个元素的宽容器,在这个容器中我不断使用push_back新元素pop_front(大约一百万次).
我目前正在使用a std::deque来执行任务,但是想知道是否std::list会更高效,因为我不需要重新分配自己(或者我可能会误认为std::deque是std::vector?).或者是否有更高效的容器满足我的需求?
PS我不需要随机访问
我试图理解[NSData writeToFile:options:error:]返回的值的含义.该方法返回BOOL,根据Apple的文档,如果操作成功,则为"YES,否则为NO".
很公平,但如果它不是,我会假设错误参数将被设置为某些可检索的NSError*值.然而,在我遇到的结果中,情况并非如此.因此我有点困惑,不知道如何确定导致失败的原因.
也就是说,我有这个代码(或多或少):
NSError* error = nil;
BOOL success = [data writeToFile: filePath error: &error];
if ( error )
NSLog( @"error = %@", [error description] );
Run Code Online (Sandbox Code Playgroud)
success结果是NO在我正在运行的代码中,但该NSLog语句永远不会执行.怎么会?
霍华德
我有一个基于时间的rails查询,它有一些奇怪的时区敏感行为,即使据我所知我使用的是UTC.简而言之,这些查询给出了不同的答案:
>> Model.find(:all,:conditions=>['created_at<=?',(Time.now-1.hours).gmtime]).length
=> 279
>> Model.find(:all,:conditions=>['created_at<=?',(Time.now-1.hours)]).length
=> 280
Run Code Online (Sandbox Code Playgroud)
DB实际上确实包含在过去一小时内创建的一个模型,并且模型的总数为280.因此只有第一个查询是正确的.
但是,在environment.rb中我有:
config.time_zone = 'UTC'
Run Code Online (Sandbox Code Playgroud)
系统时区(由'日期'报告)是BST(GMT + 1) - 因此不知何故,这会被视为UTC并打破查询.
这引起了我各种各样的问题,因为我需要将在不同时间传递的查询参数化为一个动作(然后使用Time.parse()进行转换),即使我以UTC时间发送,这个'关闭一小时'DST问题很多.即使使用'.gmtime()'也似乎无法解决它.
显然,这种差异是由某个地方的隐式转换造成的,导致BST被错误地视为UTC,但为什么呢?rails是否以UTC格式存储时间戳?Time class timezone不是很清楚吗?我正在使用Rails 2.2.2
那么这里发生了什么 - 围绕它编程的安全方法是什么?
编辑,一些额外的信息来显示DB和Time类正在做什么:
>> Model.find(:last).created_at
=> Tue, 11 Aug 2009 20:31:07 UTC +00:00
>> Time.now
=> Tue Aug 11 22:00:18 +0100 2009
>> Time.now.gmtime
=> Tue Aug 11 21:00:22 UTC 2009
Run Code Online (Sandbox Code Playgroud) 这是我目前的布局:(问题是评论)
class A
{
int foo;
}
class B : A {}
class C : B
{
void bar()
{
//I want to access foo
base.foo; // Doesn't work
base.base.foo // Doesn't work, of course
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我无法A通过base在C中使用来访问成员.我如何访问它?谢谢 :)
Visual Studio选项对话框允许您基于每种语言设置选项卡首选项(大小,插入空格等).但我经常处理几个c#项目,这些项目具有不同的设置值.
有没有办法在每个项目的基础上覆盖全局设置,或者至少在它们之间轻松切换?
我注意到我的代码不像以前那样多.今天我将更多的时间用于分析和设计,然后我将这种设计传达给程序员.然后他们做编码.这影响了我的编码效率,因为我必须参考参考文献并依赖智能感知.事情变得越来越复杂
现在,这是具有讽刺意味的.如果我雇用一名程序员并让他/她坐在电脑前,我可能会要求做一些编码,我会检查能力.我会根据他们对内存与咨询参考的使用来评估它们.也许我更喜欢那个没有过多咨询但是谁知道他们在做什么的程序员.
您有什么看法和经验?
我有这样一张桌子:
Date StudentName Score 01.01.09 Alex 100 01.01.09 Tom 90 01.01.09 Sam 70 01.02.09 Alex 100 01.02.09 Tom 50 01.02.09 Sam 100
我需要在不同日期内按分数对结果表中的学生进行排名,如下所示:
Date Student Rank 01.01.09 Alex 1 01.01.09 Tom 2 01.01.09 Sam 3 01.02.09 Alex 1 01.02.09 Sam 1 01.02.09 Tom 2
我怎么能在SQL中这样做?
使用Java EE(EJB)而不仅仅是简单的Servlet实现的主要原因是什么?
我正在开发一个新项目,主要是一个必须非常快速和可扩展的Web服务.
抱歉有任何困惑,虽然我在Java方面经验丰富,但我对Java Web世界很陌生,可能不会很好地提出这个问题.
当我尝试在模拟器中执行我的iPhone应用程序时,我收到了可怕的错误消息:
Failed to launch simulated application: Unknown error.
我的应用程序有两个目标,但这两个目标都会出现此错误.
发生错误时,模拟的操作系统会挂起 - 它会显示黑屏,不再响应任何输入.模拟器应用程序本身不会挂起 - 所有菜单都处于活动状态.
我尝试过的所有其他应用程序(主要是Apple样本)都可以正常运行.清除缓存,重新启动和在月球上嚎叫没有帮助.从头开始重建项目也没有帮助.我想我必须以较小的步骤再做一次.
同时,还有其他什么可以尝试下面这些?
来自system.log的引用:
12.08.09 0:13:59 [0x0-0xa70a7].com.apple.iphonesimulator[5368] -[MonitorController forwardEvents]: unable to send msg to ffffffff: 10000003 12.08.09 0:13:59 [0x0-0xa70a7].com.apple.iphonesimulator[5368] -[MonitorController forwardEvents]: unable to send msg to ffffffff: 10000003 12.08.09 0:14:03 com.apple.launchd[166] (com.apple.iPhoneSimulator:com.apple.dataaccess.dataaccessd) Unknown key for integer: JetsamPriority 12.08.09 0:14:03 com.apple.launchd[166] (com.apple.iPhoneSimulator:com.apple.apsd) Path monitoring failed on "/var/mobile/Library/Preferences": No such file or directory …