首先:我知道已经有很多关于循环进口主题的问题和答案.
答案或多或少是:"正确设计模块/类结构,您不需要循环导入".那是真实的.我努力为我当前的项目做一个合适的设计,我认为我是成功的.
但我的具体问题如下:我需要在模块中进行类型检查,该模块已由包含要检查的类的模块导入.但这会引发导入错误.
像这样:
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个解决方案对我来说没有选择之前:有没有人为这个问题找到更好的解决方案?
我需要视图来保存对控制器的引用,因为它需要将控制器注册为事件监听器.我需要控制器来保存对视图的引用,因为在按钮单击时,我需要能够在列表中获取所选文件.(我有一个文件列表和一个"添加群集"按钮,所以当点击按钮时我需要获取所选文件)
所以总之我有:
Controller controller(view);
View view(controller);
Run Code Online (Sandbox Code Playgroud)
我确定这里有一些不好的设计,我只是想不通如何避免它..
如何解决以下循环依赖?
typedef boost::variant<int, bool, double, std::string, Structure> Value;
typedef std::list<std::pair<std::string, ValueContainer>> Structure;
typedef std::vector<Value> ValueContainer;
Run Code Online (Sandbox Code Playgroud)
我试图用更多C++形式表示来自C api数据库库的对象.此数据库允许存储值或值数组,以及具有Structures的表示,如下所示:
typedef struct ApiStructureMember
{
char* name;
struct ApiValueContainer value;
struct ApiStructureMember_T* next;
} ApiStructureMember_T;
Run Code Online (Sandbox Code Playgroud)
最后,union用于表示值,如下所示:
typedef struct ApiValue
{
union
{
int i;
const char* s;
...
struct ApiStructureMember_T* firstStructureMember;
} value;
} ApiValue_T;
Run Code Online (Sandbox Code Playgroud) 目前,如果我想在我选择的解决方案中检查循环引用Architecture - Generate Dependency Graph - For Solution.然后从我打开的新选项卡中选择Layout - Analyzers - Circular References Analyzer.最后,如果我从单个程序集向下钻取并且有循环引用,我可以在图表上看到它们以红色突出显示,它们也在错误列表中显示为警告.
由于我打算在相同类的方法之间发现循环引用,因此在适度大的代码库上这非常容易出错且耗时.
我想知道是否有一种方法可以立即获取所有警告,而无需扩展节点或者可能打开父节点的突出显示,这样我就可以只查看肯定包含循环引用的汇编.
NDepend应该能够提供帮助,但我更喜欢让事情变得尽可能简单,所以我总是对采用其他工具持谨慎态度.
.net circular-dependency circular-reference visual-studio visual-studio-2012
基本上,我们的想法是"sub"模块创建一个对象,该对象应该是作为"主要"模块的实用程序库的一部分.但是,"sub"对象依赖于"main"中的实用程序:
// Main module
define(['sub'], function(sub) {
var utils = {
utilityMain: function () {
// ...
};
// ...
};
tools.subModule = sub;
return tools;
});
// Sub module
define(['main'], function(main) {
return new (function () {
// Singleton object using functions in main module
var somestuff = function () {
main.utilityMain();
// etc
};
})();
});
Run Code Online (Sandbox Code Playgroud)
我如何通过require.js实现这一目标,而不会产生吞噬整个星球的黑洞?
非常感谢你.
在过去的几周里,我一直在研究Java包结构和依赖模式.关于该主题的着作中的一个共同点是包依赖应该形成有向无环图(DAG)的简单规则.作者罗伯特马丁甚至正式确定了非循环依赖原则(ADP),该原则指出
包之间的依赖关系结构必须是有向无环图(DAG).也就是说,依赖结构中必须没有循环.
一些Java库确实遵循这个简单的规则.即Spring Framework库(spring-core,spring-web等)和Google Guava.
但令我惊讶的是,大多数领先的开源Java项目都没有!
以下开源项目在包之间具有循环依赖关系:
我误解了软件工程原理吗?或者开发商是否对此包装组织技术打折?
我在Backbone中使用RequireJS设置了一个嵌套的类别结构.
在此结构中,类别集合包含类别模型,单个类别模型可以包含类别集合.
不幸的是,这似乎导致RequireJS中可怕的循环依赖问题.我已经阅读了关于RequireJS的文档(http://requirejs.org/docs/api.html#circular)但是我发现'a'和'b'的解释令人困惑.
这是我的代码,导致问题:
define([
"jquery",
"underscore",
"backbone",
"collections/categories"
], function( $, _, Backbone, CategoriesCollection ) {
var Category = Backbone.Model.extend({
defaults: {
title: "Untitled"
},
parse: function(data) {
this.children = new CategoriesCollection( data.children, {parse: true} );
return _.omit( data, "children" );
}
});
return Category;
});
Run Code Online (Sandbox Code Playgroud)
...
define([
"jquery",
"underscore",
"backbone",
"models/category"
], function( $, _, Backbone, CategoryModel ) {
var Categories = Backbone.Collection.extend({
model: CategoryModel
});
return Categories;
});
Run Code Online (Sandbox Code Playgroud)
我想知道以前经历过这个的人是否可以帮助引导我朝着正确的方向前进.
在此先感谢您的帮助,
路线段已移至常量。下面的代码是简化的,但在项目中大约有 5 个惰性模块,每个模块有大约 20 个路由和段,通常在服务和组件中router.navigate用作对象中的字符串键(某些组件的图像:)assets/images/${urlSegment}.jpg。为此,段已移至常量。
路由.module.ts
export const PATIENT_URL_SEGMENTS = {
TOOLS: 'tools',
INDEX: 'index',
};
const routes = [
{ path: PATIENT_URL_SEGMENTS.TOOLS, component: ToolsComponent }
{ path: `${PATIENT_URL_SEGMENTS.TOOLS}/:${PATIENT_URL_SEGMENTS.INDEX}`, component: ToolDetailsComponent }]
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule],
providers: []
})
export class PatientRoutingModule { }
Run Code Online (Sandbox Code Playgroud)
RoutingModule用于延迟加载模块。如果我URL_SEGMENTS从单独的文件导入,在浏览器控制台中我会看到 error Can not read split of undefined。但是,如果如上面的示例中那样在适当的位置声明了常量,则一切正常。
每个导入的组件都会发出一个警告PATIENT_URL_SEGMENTS,因为同时这些组件已导入到路由模块中。事实上没有错误,但我想删除组件 import 时的警告PATIENT_URL_SEGMENTS。
你知道如何实现这一目标吗?也许可以将常量声明移动到单独的文件?
在我的 angular 项目中启用 ivy 后,一切都会编译,但是在浏览器中启动应用程序时,我在应用程序引导期间收到以下错误:
Error: Cannot instantiate cyclic dependency! ApplicationRef
at throwCyclicDependencyError (core.js:5208)
at R3Injector.push../node_modules/@angular/core/__ivy_ngcc__/fesm5/core.js.R3Injector.hydrate (core.js:11763)
at R3Injector.push../node_modules/@angular/core/__ivy_ngcc__/fesm5/core.js.R3Injector.get (core.js:11590)
at injectInjectorOnly (core.js:648)
at ??inject (core.js:653)
at injectArgs (core.js:730)
at Object.factory (core.js:11858)
at R3Injector.push../node_modules/@angular/core/__ivy_ngcc__/fesm5/core.js.R3Injector.hydrate (core.js:11767)
at R3Injector.push../node_modules/@angular/core/__ivy_ngcc__/fesm5/core.js.R3Injector.get (core.js:11590)
at injectInjectorOnly (core.js:648)
Run Code Online (Sandbox Code Playgroud)
我正在努力找出循环依赖的位置以及为什么在不使用常春藤时它可以正常工作。我尝试使用 madge (madge --circular --extensions ts ./) 但没有找到循环依赖。
编辑:我已经手动浏览了所有服务并验证它们之间没有循环依赖
我遇到了一个给我这个错误的问题:
序列化类“App\Entity\User”的对象时检测到循环引用(配置限制:1)
我有一个企业实体,其中包含任务订单、车辆和用户。
与用户、公司和车辆有关系的订单实体。
和一个与订单和公司有关系的用户实体。
所以我有这个: Entreprise.php
class Entreprise
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\OneToMany(targetEntity="App\Entity\User", mappedBy="entreprise", orphanRemoval=true)
*/
private $users;
/**
* @ORM\OneToMany(targetEntity="App\Entity\Vehicule", mappedBy="entreprise", orphanRemoval=true)
*/
private $vehicules;
/**
* @ORM\OneToMany(targetEntity="App\Entity\OrdreMission", mappedBy="entreprise", orphanRemoval=true)
*/
private $ordreMissions;
Run Code Online (Sandbox Code Playgroud)
OrdreMission.php:
class OrdreMission
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* Agent qui réalisera la mission
* @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="ordreMissions")
* @ORM\JoinColumn(nullable=false)
*/
private $user;
/**
* Immatriculation de la voiture de …Run Code Online (Sandbox Code Playgroud) angular ×2
import ×2
java ×2
javascript ×2
requirejs ×2
.net ×1
amd ×1
angular-ivy ×1
backbone.js ×1
c++ ×1
commonjs ×1
dependencies ×1
depth ×1
jquery ×1
package ×1
python ×1
reference ×1
spring ×1
symfony ×1
typescript ×1