标签: solid-principles

如何衡量 C# 代码的可靠性?

有哪些指标和工具可以衡量C# 代码的可靠性?或者有工具来表明哪些地方违反了原则造成的危害最大?

.net c# metrics code-metrics solid-principles

5
推荐指数
1
解决办法
1051
查看次数

使用一个方法做不止一件事是否违反了单一职责原则?

出于我的目的,我需要在 xml 文件中搜索特定节点,如果找到,则将其删除。我应该将搜索功能提取到其自己的方法中,并将删除功能提取到其自己的方法中吗?这样做似乎更昂贵,因为我将搜索 xml 文件一次以查看它是否存在,然后再次搜索以将其删除。如果我将这两个功能合并到一个方法中,我可以在找到它时立即将其删除。我在这里理解的SRP正确吗?

oop single-responsibility-principle solid-principles

5
推荐指数
1
解决办法
1095
查看次数

避免从高级类到低级类传递参数

在我的 Java Web 服务器项目中,我的Main.main方法采用一个参数来指定它将在其中查找某些文件的目录,稍后我将使用该文件。我的问题是,我实际上并没有在我的高级别课程中对这个论点做任何事情,但我的一些低级别课程需要这些信息。

当然,解析和存储我的命令行参数的类是最先使用的类之一,即我的最高级别的类之一,因此我正在努力寻找一种方法来使我的低级别可以访问命令行参数。级别课程。

似乎我唯一的两个选择是要么将它一直传递下去,通过除了将其传递到下一个级别之外从不触及参数的类,或者给它一个全局范围。从设计的角度来看,这两个似乎都不是很好的选择,所以我想知道是否有我缺少的替代方案,或者我是否必须选择两害相权取其轻——或者完全改变我的课程的结构方式。

java oop solid-principles

5
推荐指数
1
解决办法
1492
查看次数

.NET Core 注册具有不同数量参数的原始泛型

我正在开发一个 .NET Core 项目。我需要自动注册一些原始泛型的默认值。当参数计数相同时,一切正常。

public void RegisterServiceDefaults(IServiceCollection services)
{
     services.AddSingleton(typeof(IAdaptable<,>), typeof(DynamicAdapter<,>));
}
Run Code Online (Sandbox Code Playgroud)

我的IAdaptable<TEntity, TDTO>工作是允许实体之间动态适应,但在我的具体服务中,默认情况下我们期望一个接口,以便我们可以控制每个属性的适应方式,我IAdaptable<TEntity, TDTO>实际上只是一个包装器,以方便此接口

IAdaptable<TEntity, TIDTO, TDTO>  
    where TDTO: TIDTO
{
}

IAdaptable<TEntity, TDTO> : IAdaptable<TEntity, TDTO, TDTO>
{
}
Run Code Online (Sandbox Code Playgroud)

我如何一般地注册我的适应性,以便如果有人请求IAdaptable<TEntity, TDTO, TDTO>它会默认返回IAdaptable<TEntity, TDTO>

编辑用于理解问题 TL;DR

这用于提供两种注册方式的休息框架,最终用户可以创建一个IAdaptable<TEntity, TIDTO, TDTO> 示例适配器,可能如下所示:

public UserAdapter : IAdaptable<User, IUserDTO, UserDTO>, IUserDTO
{
     User _user;

     public UserAdapter(User user)
     {
         this._user = user;
     }


     public int Id
     {
         get => this._user.Id;
         set { /*Do nothing you …
Run Code Online (Sandbox Code Playgroud)

c# dependency-injection solid-principles .net-core asp.net-core

5
推荐指数
1
解决办法
1857
查看次数

观察者模式遵循/违反哪些可靠原则?

我正在准备考试,目前正在阅读有关观察者模式的内容。然后我想知道观察者模式遵循或违反了哪些SOLID原则?

software-design solid-principles observer-pattern

5
推荐指数
1
解决办法
3350
查看次数

当我们将职责划分为不同类别时尝试理解 SRP

我试图了解 SRP 原理,但大多数软线程没有回答我遇到的这个特定查询,

用例

每当用户尝试在网站中注册/创建用户帐户时,我都会尝试向用户的电子邮件地址发送一封电子邮件来验证自己。

没有建议零售价

class UserRegistrationRequest {
    String name;
    String emailId;
}
class UserService {
    Email email;

    boolean registerUser(UserRegistrationRequest req) {
        //store req data in database
        sendVerificationEmail(req);
        return true;
    }

    //Assume UserService class also has other CRUD operation methods()    

    void sendVerificationEmail(UserRegistrationRequest req) {
        email.setToAddress(req.getEmailId());
        email.setContent("Hey User, this is your OTP + Random.newRandom(100000));
        email.send();
    }
}
Run Code Online (Sandbox Code Playgroud)

上述类“UserService”违反了 SRP 规则,因为我们将“UserService”CRUD 操作和触发验证电子邮件代码合并到 1 个类中。

因此我这样做,

含建议零售价

class UserService {
    EmailService emailService;

    boolean registerUser(UserRegistrationRequest req) {
        //store req data in database
        sendVerificationEmail(req); …
Run Code Online (Sandbox Code Playgroud)

java oop design-patterns single-responsibility-principle solid-principles

5
推荐指数
1
解决办法
385
查看次数

如何在 PHP 中的子类继承方法中定义更严格的类型?

假设我有这样的三门课。

abstract class A {
   abstract protected function doSomething($object): array;
}

class B extends A {
   protected function doSomething(SomeObject $object): array
   {
       // something
   }
}

class C extends A {
   protected function doSomething(OtherObject $object): array
   {
       // something
   }
}
Run Code Online (Sandbox Code Playgroud)

根据 PHP 的继承原理,上述结构不是合法的 PHP 代码,因为方法定义与基类不兼容。我当然可以做类似的事情

class B extends A {
    protected function doSomething($object): array
    {
        if (!is_a($object, 'SomeObject')) {
            throw new Exception('Object passed to method is not of the correct class for this method.');
        }

        // something
    }
} …
Run Code Online (Sandbox Code Playgroud)

php oop liskov-substitution-principle solid-principles

5
推荐指数
1
解决办法
1354
查看次数

SOLID 原则可以用于高性能代码吗?

我曾经在一个专门从事高性能 C++ 代码的团队工作。为了从代码中挤出每一点性能,使用了不明显和微妙的技巧,使其难以阅读。Robert C. Martin 的“Clean Architecture”一书宣传了 SOLID 架构原则:通过依赖倒置、一次性原则等来解耦代码。额外的层和严格遵守接口似乎会妨碍某些技术以获得更好的性能。是否必须在高性能和 SOLID 架构之间做出选择?

architecture performance solid-principles

5
推荐指数
1
解决办法
113
查看次数

这个"接口编程"的工作原理是什么?

我喜欢"编程到接口"的概念,并避免使用"new"关键字.

但是,当我有两个具有相同界面但基本上与设置不同的类时,我该怎么办.在没有详细介绍我的特定代码的情况下,我有一个方法接口,"DoStuff".两个类实现此接口.一个非常简单,无需初始化即可.另一个有五个不同的变量需要设置.结合起来,当调用DoStuff时,它们允许数百万种类的方式工作.

那么我什么时候"新"这些课程呢?我虽然关于使用工厂,但由于设置的巨大差异,我不认为它们适用于这种情况.(顺便说一句:实际上有大约十个不同的类使用接口,每个类允许形成复杂管道的一部分,每个类具有不同的配置要求).

c# oop interface solid-principles

4
推荐指数
1
解决办法
1178
查看次数

我应该违反SOLID中的S还是违反DRY原则?

我有一个发送GET请求的方法,如下所示:

private JArray GetRESTData(string uri)
{
    try
    {
        var webRequest = (HttpWebRequest)WebRequest.Create(uri);
        var webResponse = (HttpWebResponse)webRequest.GetResponse();
        var reader = new StreamReader(webResponse.GetResponseStream());
        string s = reader.ReadToEnd();
        return JsonConvert.DeserializeObject<JArray>(s);
    }
    catch // This method crashes if only one json "record" is found - try this:
    {
        try
        {
            MessageBox.Show(GetScalarVal(uri));
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

...我通过在webRequest和webResponse的赋值之间加入来修改它来处理POST请求:

if (uri.ToUpper().Contains("POST"))
{
    webRequest.Method = "POST";
    webRequest.ContentLength = 0;
}
Run Code Online (Sandbox Code Playgroud)

...并将其重命名为GetOrPostRESTData()

但这违反了单一责任原则.

然而,如果我将它变成两个方法,POST方法与GET方法相同,除了条件中另外两行代码("if Post")之外,我违反了DRY,大部分代码都是一样的.

还有第三种方式吗?中途?或者我必须在这两种违规行为中做出选择 我被困在DRY和SOLID之间.

c# dry single-responsibility-principle solid-principles

4
推荐指数
1
解决办法
194
查看次数