小编Phi*_*ier的帖子

尽可能均匀地分布圆上的点

问题陈述

我有以下问题:我有一个圆圈,其上有一定数量(零个或多个)的点.这些职位是固定的.现在我必须在圆上放置另一组点,例如所有点在一起尽可能均匀地分布在圆周上.

目标

我的目标是开发一种算法,它采用角度列表(表示固定点)和一个int值(表示应该放置多少个附加点)并再次返回一个角度列表(仅包含附加点的角度)位于).

这些点不必非常均匀地分布(彼此相同的距离),而是尽可能均匀地分布.由于某些点是固定的,因此大多数时候可能不存在完美的解决方案.

所有角度的范围都在-pi和+ pi之间.

例子

我想要实现的一些例子:

fixed_points = [-pi, -pi/2, pi/2]

 v         v                   v
 |---------|---------|---------|---------|
-pi     -pi/2        0        pi/2       pi

fill_circle(fixed_points, 1)
# should return: [0]

fill_circle(fixed_points, 2)
# should return: [-pi/6, pi/6]
Run Code Online (Sandbox Code Playgroud)

要么:

fixed_points = [-pi, -pi*3/4, -pi/4]

 v    v         v
 |---------|---------|---------|---------|
-pi     -pi/2        0        pi/2       pi

fill_circle(fixed_points, 6)
Run Code Online (Sandbox Code Playgroud)

最后一个例子应该返回如下内容:一点是在-pi*3/4和-pi/4之间设置,即:-pi/2并在-pi/4和+ pi之间分配其他5个点(记住它是一个圆圈,所以在这种情况下-pi = + pi):

 v    v    x    v   x   x    x   x    x
 |---------|---------|---------|---------|
-pi     -pi/2        0        pi/2       pi
Run Code Online (Sandbox Code Playgroud)

以前的尝试

我从一个递归算法开始,首先搜索两点之间的最大间隔,然后在两者之间设置新点.然而,它没有给出令人满意的结果.例如,考虑这种配置,需要插入两个点:

 v         v                   v
 |---------|---------|---------|---------|
-pi …
Run Code Online (Sandbox Code Playgroud)

python algorithm geometry

29
推荐指数
2
解决办法
5644
查看次数

架构:以不同方式修改模型

问题陈述

我有一个模型类看起来像(非常简化;一些成员和许多方法,为清晰起见省略了许多方法):

class MyModelItem
{
public:
    enum ItemState
    {
        State1,
        State2
    };

    QString text() const;

    ItemState state() const;

private:
    QString _text;

    ItemState _state;
}
Run Code Online (Sandbox Code Playgroud)

它是应用程序的核心元素,用于代码的许多不同部分:

  • 它被串行/反序列化为各种文件格式
  • 它可以写入数据库或从数据库中读取
  • 它可以通过'import'进行更新,它可以读取文件并将更改应用于当前加载的内存模型
  • 它可以由用户通过各种GUI功能进行更新

问题是,这个类已经发展了多年,现在有几千行代码; 它已成为如何违反单一责任原则的一个典型例子.

它有直接设置'文本','状态'等的方法(反序列化后)和用于在UI中设置它们的同一组方法,这些方法有更新'lastChangedDate'和'lastChangedUser'等副作用一些方法或方法组甚至存在两次以上,其中每个方法基本上都是相同但略有不同.

在开发应用程序的新部分时,您很可能使用了五种不同操作方式的错误MyModelItem,这使得它非常耗时且令人沮丧.

要求

鉴于这个历史悠久且过于复杂的类,目标是将其所有不同的关注点分成不同的类,只留下核心数据成员.

理想情况下,我更喜欢一种解决方案,其中一个MyModelItem对象只有const成员才能访问数据和修改只能使用特殊类.

然后,这些特殊类中的每一个都可以包含业务逻辑的实际具体实现(如果要设置的文本以某个子字符串开头并且状态等于'State1',则 'text'的setter可以执行类似的操作,设置它'State2'").

解决方案的第一部分

对于加载和存储整个模型(包括许多MyModelItem对象等),访问者模式看起来是一个很有前景的解决方案.我可以为不同的文件格式或数据库模式实现几个访问者类,并且有一个saveload方法MyModelItem,每个都接受这样的访问者对象.

打开问题

当用户输入特定文本时,我想验证该输入.如果输入来自应用程序的另一部分,则必须进行相同的验证,这意味着我无法将验证移动到UI中(在任何情况下,仅UI验证通常是个坏主意).但如果验证发生在MyModelItem自身,我又有两个问题:

  • 关注的分离,这是开始的目标被否定.所有业务逻辑代码仍然被"转储"到穷人模型中.
  • 当应用程序的其他部分调用时,此验证必须具有不同的外观.实现不同的验证设置器方法是如何立即完成的,它具有糟糕的代码味道.

现在很清楚,验证必须在UI和模型之外移动到某种控制器(在MVC意义上)类或类集合中.然后,这些应该用它的数据装饰/访问/等实际的哑模型类.

哪种软件设计模式最适合所描述的情况,以允许不同的方式来修改我的类的实例?

我问,因为我所知道的模式都没有完全解决我的问题,我觉得我在这里遗漏了一些东西......

非常感谢你的想法!

c++ oop refactoring qt design-patterns

12
推荐指数
2
解决办法
437
查看次数

以编程方式检查驱动器号是否为共享/网络驱动器

有没有办法检查驱动器号是否代表共享驱动器/网络驱动器或python中的本地光盘?我想有一些Windows api函数给了我这些信息,但我找不到它.也许甚至已经在python中集成了一种方法?

我正在寻找的是具有这种或类似行为的东西:

someMagicMethod("C:\\")  #outputs True 'is a local drive'
someMagicMethod("Z:\\")  #outputs False 'is a shared drive'
Run Code Online (Sandbox Code Playgroud)

这对我也有帮助:

someMagicMethod2()  #outputs list of shared drive letters
Run Code Online (Sandbox Code Playgroud)

python winapi network-drive drive-letter

11
推荐指数
1
解决办法
2380
查看次数

在C++ 11标准的§7.3.1.2/ 3中有一些我不理解的细节

C++ 11标准中的§7.3.1.2/ 3(重点是我的):

首先在名称空间中声明的每个名称都是该名称空间的成员.如果非本地类中的友元声明首先声明一个类或函数,那么友元类或函数是最内层封闭命名空间的成员.在非命名查找(3.4.1)或限定查找(3.4.3)之前找不到朋友的名称,直到在该命名空间范围内提供匹配声明(在授予友谊的类定义之前或之后).如果调用了友元函数,则可以通过名称查找找到其名称,该名称查找考虑名称空间中的函数和与函数参数类型相关联的类(3.4.2).如果友元声明中的名称既不是限定语句也不是模板标识,并且声明是函数或详细类型说明符,则确定实体是否先前已声明的查找不应考虑最内层封闭命名空间之外的任何范围.[注意:其他形式的友元声明不能声明最内层封闭命名空间的新成员,因此遵循通常的查找规则.

例:

// Assume f and g have not yet been defined.
void h(int);
template <class T> void f2(T);
namespace A {
    class X {
        friend void f(X); // A::f(X) is a friend
        class Y {
            friend void g(); // A::g is a friend
            friend void h(int); // A::h is a friend
            // ::h not considered
           friend void f2<>(int); // ::f2<>(int) is a friend
        };
    };
    // A::f, A::g and A::h are not visible …
Run Code Online (Sandbox Code Playgroud)

c++ namespaces friend language-lawyer c++11

10
推荐指数
1
解决办法
556
查看次数

多线程 API 应用程序中的 EF 核心 DbContext

tl;dr即使 DbContext 不是线程安全的,我如何在多线程 .NET Core API 应用程序中使用实体框架?

语境

我正在开发一个 .NET Core API 应用程序,它公开了几个访问数据库并从中读取数据的 RESTful 接口,同时运行多个 TimedHostedServices 作为后台工作线程,定期从其他 Web 服务轮询数据并将它们存储到数据库中。

我知道 DbContext 不是线程安全的。我在 Stackoverflow 上阅读了很多文档、博客文章和答案,我可以找到很多(部分矛盾的)答案,但在使用 DI 时没有真正的“最佳实践”。

我尝试过的事情

由于竞争条件,ServiceLifetime.Scoped通过AddDbContext扩展方法使用默认值会导致异常。

我不想使用锁(例如信号量),因为明显的缺点是:

  • 代码被锁污染,并且 try/catch/finally 安全地释放锁
  • 它看起来并不“健壮”,即当我忘记锁定访问 DbContext 的区域时。
  • 在使用同时处理并发连接和访问的数据库时,人为地同步应用程序中的数据库访问似乎是多余和“不自然的”

不是注入MyDbContextDbContextOptions<MyDbContext>而是仅在我需要访问数据库时构建上下文,using在读/写后使用语句立即处理它似乎有很多资源使用开销和不必要的许多连接打开/关闭。

我真的很纳闷:这怎么能实现呢?

我不认为我的用例是超级特殊的——从后台工作人员填充数据库并从 Web API 层查询它——所以应该有一种有意义的方法来使用 ef core 来做到这一点。

非常感谢!

c# entity-framework entity-framework-core .net-core asp.net-core

9
推荐指数
2
解决办法
9212
查看次数

Python:类型检查所需的循环导入

首先:我知道已经有很多关于循环进口主题的问题和答案.

答案或多或少是:"正确设计模块/类结构,您不需要循环导入".那是真实的.我努力为我当前的项目做一个合适的设计,我认为我是成功的.

但我的具体问题如下:我需要在模块中进行类型检查,该模块已由包含要检查的类的模块导入.但这会引发导入错误.

像这样:

foo.py:

from bar import Bar

class Foo(object):

    def __init__(self):
        self.__bar = Bar(self)
Run Code Online (Sandbox Code Playgroud)

bar.py:

from foo import Foo

class Bar(object):

    def __init__(self, arg_instance_of_foo):
        if not isinstance(arg_instance_of_foo, Foo):
            raise TypeError()
Run Code Online (Sandbox Code Playgroud)

解决方案1:如果我修改它以通过字符串比较检查类型,它将起作用.但我真的不喜欢这个解决方案(对于简单的类型检查,字符串比较相当昂贵,并且在重构时可能会遇到问题).

bar_modified.py:

from foo import Foo

class Bar(object):

    def __init__(self, arg_instance_of_foo):
        if not arg_instance_of_foo.__class__.__name__ == "Foo":
            raise TypeError()
Run Code Online (Sandbox Code Playgroud)

解决方案2:我也可以将这两个类打包成一个模块.但我的项目有许多不同的类,如"Bar"示例,我想将它们分成不同的模块文件.

在我自己的2个解决方案对我来说没有选择之前:有没有人为这个问题找到更好的解决方案?

python import circular-dependency

8
推荐指数
2
解决办法
2009
查看次数

覆盖另一个程序集中的内部抽象方法

我目前正在使用另一个.net库的ac#项目.该库(除其他外)将序列解析为树.所有项都是从抽象类继承的某种类型Sequence.我需要稍微改变行为并将Sequence自己子类化(让我们称之为MySequence).树创建后,我可以用我自己的类的对象替换一些树节点.

现在,发布了新版本的库,并Copy引入了具有以下签名的函数:

internal abstract Sequence Copy();
Run Code Online (Sandbox Code Playgroud)

我试图将我的代码用于新版本并覆盖它,但无论我做什么,我都会遇到两个错误:

MySequence没有实现继承的抽象成员' Sequence.Copy()'
和:
MySequence.Copy()':找不到合适的方法来覆盖

这是有道理的,因为它是抽象的( - >它必须被覆盖)和内部的( - >它不能被覆盖,因为来自程序集外部的隐藏可见性)

所以,问题是,我明白为什么会这样,但不知道该怎么办.对我的项目来说,子类是至关重要的Sequence.

而我也不明白的是,为什么internal abstract首先允许使用modfier,因为它基本上允许从程序集外部对整个类进行任何子类化!

有什么方法可以解决这个问题吗?通过反思或什么?

提前致谢!

.net c# overriding visibility

8
推荐指数
1
解决办法
3958
查看次数

项目符号列表项始终缩进1.8em吗?

我做了一个仅限css的下拉菜单.要求是有一个水平条形项目,每个项目都可以下拉垂直菜单.此外,这些项目不应该删除三级菜单,而只是显示项目符号列表.我的html有三个嵌套ul,菜单在所有现代浏览器中都运行良好.它看起来像这样:

原版的

但是,我不喜欢链接后面较暗的盒子是如何从子弹开始的,并没有延伸整个菜单宽度,所以我玩了一下,最后来到这个调整:

#nav li ul li ul li a {
    padding-left:1.8em;
    margin-left:-1.8em;
}
Run Code Online (Sandbox Code Playgroud)

现在,项目符号菜单项看起来就像我想要的那样:

工作的

由于em相对于字体大小的beeing 的性质,它的工作独立于字体大小,如下所示更大的字体大小:

工作(较大的字体)

我在Internet Explorer 8 + 9 + 10(开发者预览版),Firefox 3 + 7,最新的Chrome,Opera和Safari上进行了测试,它就像一个魅力.

但是,我只是不明白为什么正是1.8em才能完成这项工作.为什么每个浏览器到目前为止都缩进了子弹项?我在这个主题上搜索了互联网,但我没有找到任何有用的信息.我可以确定这适用于未来的浏览器吗?这些1.8em是否在HTML标准中指定?

提前感谢任何暗示!

编辑:

DisgruntledGoat的回答:如果我使用1em/-1em或20px/-20px,它将无效.有了这种风格:

#nav li ul li ul li a {
    padding-left:20px;
    margin-left:-20px;
}
Run Code Online (Sandbox Code Playgroud)

我得到这个(显然不是缩放字体大小)结果为不同的字体大小:

基于像素

类似地,1em/-1em也是关闭的,看起来像在上图中的右侧,但缩放与字体大小.由于某种原因,看起来1.8em仍然是神奇的距离......

css browser fonts cross-browser html-rendering

8
推荐指数
2
解决办法
2012
查看次数

在 OpenAPI 中,如何定义具有属性和内容的 XML 元素?

我想用 OpenAPI 2.0 (Swagger 2.0) 描述 RESTful 接口的 XML 响应负载。但是,我很难在 OpenAPI 数据模型中描述特定的 XML 标记。

我无法让 Swagger UI 以这种形式创建适当的示例 XML 标签,在开始和结束 XML 标签之间有一个属性内容:

<Person id="bar">foo</Person>
Run Code Online (Sandbox Code Playgroud)

文档(此处)仅描述了如何为带有子标签 ( type: object) 的标签或带有内容 ( type: string)的标签建模,但不能同时为两者建模。

我试过这个,Swagger 编辑器接受它,没有任何错误或警告:

<Person id="bar">foo</Person>
Run Code Online (Sandbox Code Playgroud)

但它将由 Swagger UI 呈现为以下示例:

<Person id="bar"></Person>
Run Code Online (Sandbox Code Playgroud)

如您所见,其中没有“foo”内容。

xml swagger openapi

8
推荐指数
1
解决办法
4367
查看次数

使用已知但未给定的时区解析DateTime

我在解析日期和时间时遇到了一个问题:

我正在尝试解析从德国网站提取的日期时间字符串.它的格式为'day.month.year 24hours:minutes',如:

01.01.2011 17:00
Run Code Online (Sandbox Code Playgroud)

它总是在德国时区.但问题出现了:

  • '01 .01.2011 17:00'应解析为UTC的'01 .01.2011 16:00'的DateTime结构(此处,时区为CET,没有夏令时)
  • 而01 .06.2011 17:00'应该解释为与01 .01.2011 15:00'一个DateTime结构在UTC(这里,时区是CEST,夏令时)

我不知道如何实现这一目标.如果我将本地时钟设置为德国时区,并使用DateTime.ParseExact和解析标志DateTimeStyles.AssumeLocalDateTimeStyles.AdjustToUniversal正确解析它.但是,我希望任何客户端独立于本地时钟和时区解析它.另外,我不想自己做时区偏移,因为它取决于日期(夏天:-2 /冬季:-1).

一旦我有UTC的日期时间,很容易将其转换为任何本地时区.

c# timezone datetime parsing windows-phone-7

6
推荐指数
2
解决办法
4163
查看次数