我一直在阅读当你尝试在项目中实现单元测试时,静态方法,静态类和单例是邪恶的.在遵循TDD范例时,我是否应该忘记它们曾经存在过并且从未再次使用它们,或者有时可以使用它们吗?
给定一个带有初始化方法的静态类:
public static class Foo
{
// Class members...
internal static init()
{
// Do some initialization...
}
}
Run Code Online (Sandbox Code Playgroud)
如何确保之前运行初始化程序Main()?
我能想到的最好的是将其添加到Foo:
private class Initializer
{
private static bool isDone = false;
public Initializer()
{
if (!isDone)
{
init();
isDone = true;
}
}
}
private static readonly Initializer initializer = new Initializer();
Run Code Online (Sandbox Code Playgroud)
这会有用还是有一些不可预见的警告?还有更好的方法吗?
我在我的控制器上使用依赖注入正好记录,现在我需要从静态类中记录一些东西.
如何从静态类登录?
我不能使用依赖注入,因为它是静态的,我不能只将现有的logger对象传递给静态类,因为它在日志文件中会有错误的类名.
换句话说,如何从静态类中的loggerfactory中获取记录器?
我遇到了一个类似的问题,他们指出了一篇关于静态类中loggerfactory的文章,但实际上并没有工作,因为我无法从中获取新的记录器,因为它不会接受静态类作为参数:
"静态类型不能用作类型参数"
logging dependency-injection static-classes asp.net-core asp.net-core-webapi
在使用laravel框架时,如何在视图中调用base_controller中定义的函数.例如:
class Base_Controller extends Controller {
public static function format_something()
{
return something;
}
}
Run Code Online (Sandbox Code Playgroud)
如何在视图文件中调用format_something()?
通常我得到的错误看起来像这样:方法[link_to_action]没有在View类上定义.
可能是一个愚蠢的问题,但提前感谢!
编辑
好的!首先,做这样的事情的正确位置是在libraries文件夹中.第二,问题是你的班级不能有下划线.
所以在应用程序/库中我用class创建了AppHelper.php文件
class AppHelper {
public static function format_something()
{
return something;
}
}
Run Code Online (Sandbox Code Playgroud)
可以称之为:
$formated = AppHelper::format_something;
Run Code Online (Sandbox Code Playgroud)
感谢您的帮助和良好的论坛找到Boofus McGoofus.
我们需要在具有静态方法的代码中使用非托管库.我想在我的代码中将库操作作为依赖项引入.除了具有静态方法之外,库还具有初始化方法和设置方法,两者都是全局的.所以我不能将它包装在一个实例类中,因为如果一个实例更改了一个设置,那么所有其他实例都会受到影响,如果一个实例被初始化,所有其他实例都将被重新初始化.
我想把它作为一个单独的类引入.这样它将在实例类中,但只有一个实例,因此我不必担心更改设置或初始化.您如何看待这种方法?我对依赖注入模式很新,我不确定单例模式是否是一个好的解决方案?您对类似案例的解决方案是什么?
编辑:初始化也接受一个参数,所以我不能只是锁定方法调用,并在每次调用时重新初始化和更改设置.
编辑2:以下是一些方法的签名:
public static void Initialize(int someParameter)
// Parameter can only be changed by re-initalization which
// will reset all the settings back to their default values.
public static float[] Method1(int someNumber, float[] someArray)
public static void ChangeSetting(string settingName, int settingValue)
Run Code Online (Sandbox Code Playgroud) c# singleton refactoring dependency-injection static-classes
我对使用方法与C#中的对象进行交互的不同方式有点困惑,特别是以下主要设计差异和后果:
例:
public class MyPoint
{
public double x { get; set; }
public double y { get; set; }
public double? DistanceFrom(MyPoint p)
{
if (p != null)
{
return Math.Sqrt(Math.Pow(this.x - p.x, 2) + Math.Pow(this.y - p.y, 2));
}
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
如果您只需将方法放在类定义中就可以完成所需的结果,那么为什么POCO与静态辅助类或扩展方法结合起来会更好?
我想知道使用静态类的静态类与使用相同静态方法的静态类的一般好处(或缺点),除了我不能使用非静态类的静态方法扩展方法.
例如:
class NonStaticClass
{
public static string GetData()
{
return "This was invoked from a non-static class.";
}
}
Run Code Online (Sandbox Code Playgroud)
对此:
static class StaticClass
{
public static string GetData()
{
return "This was invoked from a static class.";
}
}
Run Code Online (Sandbox Code Playgroud)
使用一种方法比另一种方法有什么性能/内存含义?
注意:假设我不需要实例化该类.我的用例场景仅限于以下内容:
Console.WriteLine(NonStaticClass.GetData());
Console.WriteLine(StaticClass.GetData());
Run Code Online (Sandbox Code Playgroud) 我正在寻找一个名为VectorCalculator的静态类.也许这个函数应该放在我的Vector类中(类似于NSString的 - -stringByAppendingStringObj-C中的方法)......如果你认为......让我知道.
无论如何,我想在一个名为VectorCalculator的静态类中添加几个静态函数.它将计算'点积'并返回一个Vector.另一个功能可能是"计算并返回两个给定矢量之间的角度".
A)是否有人会为此创建一个静态类
B)我应该将这些函数添加为Vector类的实例函数,例如...... public func dotProductWithVector(v: Vector) -> Vector和public func angleWithVector(v: Vector) -> Double.然后这两个参数向量v将应用于Vector类main Vector u.
去A或B有什么好处?
如果您认为B,仅供将来参考,您将如何在Swift中创建一个全静态类?
static-classes ×10
c# ×6
.net ×2
singleton ×2
asp.net-core ×1
laravel ×1
logging ×1
performance ×1
php ×1
poco ×1
refactoring ×1
swift ×1
tdd ×1