小编Ada*_*dam的帖子

在django中分离业务逻辑和数据访问

我正在Django中编写一个项目,我发现80%的代码都在文件中models.py.这段代码令人困惑,经过一段时间后,我不再明白究竟发生了什么.

这是困扰我的:

  1. 我发现我的模型级别(它应该只负责处理数据库中的数据)也发送电子邮件,在API上运行到其他服务等等,这让我觉得很难看.
  2. 此外,我发现在业务逻辑中放置业务逻辑是不可接受的,因为这样很难控制.例如,在我的应用程序中,至少有三种创建新实例的方法User,但从技术上讲,它应该统一创建它们.
  3. 我并不总是注意到我的模型的方法和属性何时变得不确定,何时会产生副作用.

这是一个简单的例子.起初,User模型是这样的:

class User(db.Models):

    def get_present_name(self):
        return self.name or 'Anonymous'

    def activate(self):
        self.status = 'activated'
        self.save()
Run Code Online (Sandbox Code Playgroud)

随着时间的推移,它变成了这样:

class User(db.Models):

    def get_present_name(self): 
        # property became non-deterministic in terms of database
        # data is taken from another service by api
        return remote_api.request_user_name(self.uid) or 'Anonymous' 

    def activate(self):
        # method now has a side effect (send message to user)
        self.status = 'activated'
        self.save()
        send_mail('Your account is activated!', '…', [self.email])
Run Code Online (Sandbox Code Playgroud)

我想要的是在我的代码中分离实体:

  1. 我的数据库,数据库级别的实体:什么包含我的应用程序?
  2. 我的应用程序的实体,业务逻辑级别:什么可以使我的应用程序?

实现可以在Django中应用的这种方法有哪些好的做法?

python django model-view-controller business-logic-layer data-access-layer

441
推荐指数
5
解决办法
9万
查看次数

异步初始化的React.js组件的服务器端呈现策略

React.js的一大优势应该是服务器端渲染.问题是密钥功能React.renderComponentToString()是同步的,这使得在服务器上呈现组件层次结构时无法加载任何异步数据.

假设我有一个用于评论的通用组件,我可以在页面的任何位置删除它.它只有一个属性,某种标识符(例如文章的id在其下面放置注释),其他所有内容都由组件本身处理(加载,添加,管理注释).

我非常喜欢Flux架构,因为它使很多东西变得更容易,而且它的商店非常适合在服务器和客户端之间共享状态.一旦我的包含注释的商店被初始化,我就可以将其序列化并将其从服务器发送到客户端,在那里可以轻松恢复.

问题是填充我的商店的最佳方式是什么.在过去的几天里,我一直在谷歌搜索,我遇到了一些策略,考虑到React的这个功能被"提升"多少,这些策略看起来都不是很好.

  1. 在我看来,最简单的方法是在实际渲染开始之前填充我的所有商店.这意味着在组件层次结构之外的某个地方(例如,挂钩到我的路由器).这种方法的问题是我必须两次定义页面结构.考虑一个更复杂的页面,例如一个包含许多不同组件的博客页面(实际的博客帖子,评论,相关帖子,最新帖子,推特流......).我必须使用React组件设计页面结构,然后在其他地方我必须定义为当前页面填充每个所需存储的过程.这似乎不是一个很好的解决方案.不幸的是,大多数同构教程都是以这种方式设计的(例如,这个伟大的通量教程).

  2. React-async.这种方法很完美.它让我只需在每个组件的特殊函数中定义如何初始化状态(无论是同步还是异步),并在层次结构呈现为HTML时调用这些函数.它的工作方式是在状态完全初始化之前不会呈现组件.问题是它需要Fibers,据我所知,这是一个改变标准JavaScript行为的Node.js扩展.虽然我非常喜欢这个结果,但在我看来,我们并没有找到解决方案,而是改变了游戏规则.而且我认为我们不应该被迫这样做来使用React.js的这个核心功能.我也不确定这个解决方案的一般支持.是否可以在标准Node.js虚拟主机上使用Fiber?

  3. 我自己在思考一点.我没有真正想过通过实现细节,但一般的想法是我会以类似于React-async的方式扩展组件,然后我会在根组件上重复调用React.renderComponentToString().在每次传递过程中,我会收集扩展回调,然后在传递和传递中调用它们来填充商店.我将重复此步骤,直到填充当前组件层次结构所需的所有存储.有很多事情需要解决,我对性能特别不确定.

我错过了什么?还有其他方法/解决方案吗?现在我正在考虑采用react-async/fiber方式,但我并不完全确定它,如第二点所述.

关于GitHub的相关讨论.显然,没有官方方法甚至解决方案.也许真正的问题是如何使用React组件.像简单的视图层(几乎是我的建议第一)或像真正的独立和独立组件?

flux node.js reactjs reactjs-flux

111
推荐指数
2
解决办法
1万
查看次数

Visual Studio 2012中的纯C#编辑器(无智能感知,无缩进,无代码突出显示)

我刚刚在我的机器上安装了visual studio 2012,之前我曾安装过visual studio 2012 RC.安装成功,但在我打开一个项目之后,C#编辑器无法运行,就像这样的纯文本编辑器:

C#编辑

我已经尝试修复它,完全卸载然后重新安装,但没有成功.

有人有想法吗?

我不知道它是否相关,但是在创建新项目或打开现有项目时,我有时也会收到此错误:

Vs错误

提前致谢

.net c# visual-studio visual-studio-2012

55
推荐指数
3
解决办法
2万
查看次数

Vim增量搜索

我在Linux机器上使用putty.我在vi中搜索的常用方法是输入斜杠/,然后输入我的搜索字符串,输入,然后通过nshift+ 查看所有匹配项n.

我想知道vi是否有像Eclipse的增量搜索(ctrl+ j)这样的功能,其中当我输入时,它跳转到下一个逻辑匹配.我想我的一位同事曾经这样做,但我不确定.

eclipse linux vim putty

31
推荐指数
1
解决办法
1万
查看次数

枚举已弃用c#

我有一个不推荐使用的(已过时的)函数,它返回一个枚举,我有一个返回枚举列表的新函数.

其中一个枚举值仅在不推荐使用的函数中使用,因此可以将枚举成员设置为过时(因为它不能在列表中)?

.net c# enums

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

使用单个对象和另一个对象列表初始化列表

我想用一个对象和特定顺序的对象列表初始化一个列表.目前,我正在做:

List<MyObject> list = new List<MyObject>();
list.Add(object1); // object1 is type MyObject
list.AddRange(listOfObjects); // listOfObjects is type List<MyObject>
Run Code Online (Sandbox Code Playgroud)

我希望将其整合到初始化语句中(当然语法错误):

List<MyObject> newList = new List<MyObject>() { object1, listOfObjects };
Run Code Online (Sandbox Code Playgroud)

有没有办法简洁地做到这一点?

c# collections collection-initializer

23
推荐指数
3
解决办法
2万
查看次数

ObservableCollection <T> .Move(int,int)如何工作?

我似乎无法通过阅读MSDN上的ObservableCollection.Move(int oldIndex,int newIndex)文档来解决这个问题:

oldIndex类型:System.Int32从零开始的索引,指定要移动的项的位置.newIndex类型:System.Int32从零开始的索引,指定项的新位置.

我不明白它是如何工作的.该项目会发生什么变化newIndex?我的假设是每个项目的索引index >= newIndex递减.这个假设是否正确?更重要的是,在MSDN上某处解释或描述了这种行为?

.net c# collections

22
推荐指数
1
解决办法
7851
查看次数

为什么包含类的名称不被识别为返回值函数注释?

我打算使用Python函数注释来指定静态工厂方法的返回值的类型.我知道这是注释的理想用例之一.

class Trie:
    @staticmethod
    def from_mapping(mapping) -> Trie:
        # docstrings and initialization ommitted
        trie = Trie()
        return trie
Run Code Online (Sandbox Code Playgroud)

PEP 3107指出:

函数注释只不过是一种在编译时将任意Python表达式与函数的各个部分相关联的方法.

Trie是Python中的有效表达式,不是吗?Python不同意或者更确切地说,找不到名称:

def from_mapping(mapping) -> Trie:
NameError: name 'Trie' is not defined

值得注意的是,如果指定了基本类型(例如objector int)或标准库类型(例如collections.deque),则不会发生此错误.

导致此错误的原因是什么?如何解决?

python annotations type-hinting python-3.x

19
推荐指数
2
解决办法
1121
查看次数

如何将StreamReader转换为字符串?

我修改了我的代码,因此我可以将文件打开为只读.现在我无法使用,File.WriteAllText因为我的FileStreamStreamReader没有转换为字符串.

这是我的代码:

static void Main(string[] args)
{
    string inputPath = @"C:\Documents and Settings\All Users\Application Data\"
                     + @"Microsoft\Windows NT\MSFax\ActivityLog\OutboxLOG.txt";
    string outputPath = @"C:\FAXLOG\OutboxLOG.txt";

    var fs = new FileStream(inputPath, FileMode.Open, FileAccess.Read,
                                      FileShare.ReadWrite | FileShare.Delete);
    string content = new StreamReader(fs, Encoding.Unicode);

    // string content = File.ReadAllText(inputPath, Encoding.Unicode);
    File.WriteAllText(outputPath, content, Encoding.UTF8);
}
Run Code Online (Sandbox Code Playgroud)

c# streamreader

18
推荐指数
2
解决办法
7万
查看次数

在C#中最简单的方法来确定应用程序是否从网络驱动器运行?

我想以编程方式查明我的应用程序是否从网络驱动器运行.这样做最简单的方法是什么?它应该支持UNC路径(\\127.0.0.1\d$)和映射的网络驱动器(Z :).

.net c# network-drive

18
推荐指数
1
解决办法
2634
查看次数