有哪些指标和工具可以衡量C# 代码的可靠性?或者有工具来表明哪些地方违反了原则造成的危害最大?
出于我的目的,我需要在 xml 文件中搜索特定节点,如果找到,则将其删除。我应该将搜索功能提取到其自己的方法中,并将删除功能提取到其自己的方法中吗?这样做似乎更昂贵,因为我将搜索 xml 文件一次以查看它是否存在,然后再次搜索以将其删除。如果我将这两个功能合并到一个方法中,我可以在找到它时立即将其删除。我在这里理解的SRP正确吗?
在我的 Java Web 服务器项目中,我的Main.main方法采用一个参数来指定它将在其中查找某些文件的目录,稍后我将使用该文件。我的问题是,我实际上并没有在我的高级别课程中对这个论点做任何事情,但我的一些低级别课程需要这些信息。
当然,解析和存储我的命令行参数的类是最先使用的类之一,即我的最高级别的类之一,因此我正在努力寻找一种方法来使我的低级别可以访问命令行参数。级别课程。
似乎我唯一的两个选择是要么将它一直传递下去,通过除了将其传递到下一个级别之外从不触及参数的类,或者给它一个全局范围。从设计的角度来看,这两个似乎都不是很好的选择,所以我想知道是否有我缺少的替代方案,或者我是否必须选择两害相权取其轻——或者完全改变我的课程的结构方式。
我正在开发一个 .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
我正在准备考试,目前正在阅读有关观察者模式的内容。然后我想知道观察者模式遵循或违反了哪些SOLID原则?
我试图了解 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
假设我有这样的三门课。
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) 我曾经在一个专门从事高性能 C++ 代码的团队工作。为了从代码中挤出每一点性能,使用了不明显和微妙的技巧,使其难以阅读。Robert C. Martin 的“Clean Architecture”一书宣传了 SOLID 架构原则:通过依赖倒置、一次性原则等来解耦代码。额外的层和严格遵守接口似乎会妨碍某些技术以获得更好的性能。是否必须在高性能和 SOLID 架构之间做出选择?
我喜欢"编程到接口"的概念,并避免使用"new"关键字.
但是,当我有两个具有相同界面但基本上与设置不同的类时,我该怎么办.在没有详细介绍我的特定代码的情况下,我有一个方法接口,"DoStuff".两个类实现此接口.一个非常简单,无需初始化即可.另一个有五个不同的变量需要设置.结合起来,当调用DoStuff时,它们允许数百万种类的方式工作.
那么我什么时候"新"这些课程呢?我虽然关于使用工厂,但由于设置的巨大差异,我不认为它们适用于这种情况.(顺便说一句:实际上有大约十个不同的类使用接口,每个类允许形成复杂管道的一部分,每个类具有不同的配置要求).
我有一个发送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之间.
solid-principles ×10
oop ×5
c# ×4
single-responsibility-principle ×3
java ×2
.net ×1
.net-core ×1
architecture ×1
asp.net-core ×1
code-metrics ×1
dry ×1
interface ×1
liskov-substitution-principle ×1
metrics ×1
performance ×1
php ×1