Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >已有iOS工程中加入Flutter之Cocoapods+Flutter环境方式集成

已有iOS工程中加入Flutter之Cocoapods+Flutter环境方式集成

作者头像
conanma
发布于 2022-01-10 04:00:03
发布于 2022-01-10 04:00:03
2.7K00
代码可运行
举报
文章被收录于专栏:正则正则
运行总次数:0
代码可运行

一、环境

Mac OS:10.14.6 Xcode:11.3 Flutter:1.12.13+hotfix.5 • channel stable • Dart 2.7.0 已经安装有Cocoapods,如果没有安装请移驾这里

如果集成方式有更新,请看最新官方文档

Demo地址

Note: 下载好demo后,请在kk_flutter项目中分别运行flutter pub getflutter build ios --debug后,再在Xcode上运行项目。否则可能会遇见Command PhaseScriptExecution failed with a nonzero exit code错误,或者Flutter/Flutter.h' file not found错误

Note:应用程序将无法在Release模式下运行到模拟器上,因为Flutter尚不支持Dart代码的输出x86预编译(AOT)二进制文件。 您可以在模拟器或真实设备上以Debug模式运行,而在真实设备上以Release模式运行。

二、集成方式

官方说有两种集成方式,分别是:

  1. 使用CocoaPods依赖性管理器和已安装的Flutter SDK(官方推荐)。
  2. 为Flutter引擎,已编译的Dart代码和所有Flutter插件创建Framework。手动嵌入Framework,并在Xcode中更新现有应用程序的构建设置。

三、创建Flutter_Module

  1. 进入到和我们iOS项目同级别的文件夹目录下
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
KKdeMacBook-Pro:~ kaye$ cd Desktop/NativeFultter/
  1. 创建flutter_module,这里将flutter_module命名为“kk_flutter” Note:flutter_module的命名要符合dart package name规范,要以小写单词和_相连,否则创建不成功

先给一个不规范的例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Last login: Wed Dec 25 09:05:21 on console
KKdeMacBook-Pro:~ kaye$ cd Desktop/NativeFultter/
KKdeMacBook-Pro:NativeFultter kaye$ flutter create -t module KKFlutter
╔════════════════════════════════════════════════════════════════════════════╗
  ║                 Welcome to Flutter! - https://flutter.dev                  ║
  ║                                                                            ║
  ║ The Flutter tool uses Google Analytics to anonymously report feature usage ║
  ║ statistics and basic crash reports. This data is used to help improve      ║
  ║ Flutter tools over time.                                                   ║
  ║                                                                            ║
  ║ Flutter tool analytics are not sent on the very first run. To disable      ║
  ║ reporting, type 'flutter config --no-analytics'. To display the current    ║
  ║ setting, type 'flutter config'. If you opt out of analytics, an opt-out    ║
  ║ event will be sent, and then no further information will be sent by the    ║
  ║ Flutter tool.                                                              ║
  ║                                                                            ║
  ║ By downloading the Flutter SDK, you agree to the Google Terms of Service.  ║
  ║ Note: The Google Privacy Policy describes how data is handled in this      ║
  ║ service.                                                                   ║
  ║                                                                            ║
  ║ Moreover, Flutter includes the Dart SDK, which may send usage metrics and  ║
  ║ crash reports to Google.                                                   ║
  ║                                                                            ║
  ║ Read about data we send with crash reports:                                ║
  ║ https://github.com/flutter/flutter/wiki/Flutter-CLI-crash-reporting        ║
  ║                                                                            ║
  ║ See Google's privacy policy:                                               ║
  ║ https://www.google.com/intl/en/policies/privacy/                           ║
  ╚════════════════════════════════════════════════════════════════════════════╝

"KKFlutter" is not a valid Dart package name.

From the [Pubspec format
description](https://www.dartlang.org/tools/pub/pubspec.html):

**DO** use `lowercase_with_underscores` for package names.

Package names should be all lowercase, with underscores to separate words,
`just_like_this`.  Use only basic Latin letters and Arabic digits: [a-z0-9_].
Also, make sure the name is a valid Dart identifier -- that it doesn't start
with digits and isn't a reserved word.

然后再来个正常的流程:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
KKdeMacBook-Pro:NativeFultter kaye$ flutter create -t module kk_flutter
Creating project kk_flutter... androidx: true
  kk_flutter/test/widget_test.dart (created)
  kk_flutter/kk_flutter.iml (created)
  kk_flutter/.gitignore (created)
  kk_flutter/.metadata (created)
  kk_flutter/pubspec.yaml (created)
  kk_flutter/README.md (created)
  kk_flutter/lib/main.dart (created)
  kk_flutter/kk_flutter_android.iml (created)
  kk_flutter/.idea/libraries/Flutter_for_Android.xml (created)
  kk_flutter/.idea/libraries/Dart_SDK.xml (created)
  kk_flutter/.idea/modules.xml (created)
  kk_flutter/.idea/workspace.xml (created)
Running "flutter pub get" in kk_flutter...                          2.9s
Wrote 12 files.

All done!
Your module code is in kk_flutter/lib/main.dart.
KKdeMacBook-Pro:NativeFultter kaye$ 

这个时候,我们的目录结构是这样的:

进入到kk_flutter中,目录结构类似于这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kk_flutter/
├─.ios/ #隐藏文件,可以使用Command+shift+. 显示隐藏文件
│ ├─Runner.xcworkspace
│ └─Flutter/podhelper.rb
├─lib/ #我们的代码都写在这个文件夹中
│ └─main.dart
├─test/
└─pubspec.yaml #flutter依赖的库,都写在这里

四、将已经创建的flutter_module集成到现有的iOS项目中

4.1 手动导入

如果你想直接手动形式集成Framewok,可以在kk_flutter路径下,使用flutter build ios-framework --output=你想要导出的Framework路径(比如: /Users/kaye/Desktop/ios_flutter/NativeFlutter_module/Flutterframeworks),此时在你的指定目录下,会自动生成三个文件件分别是Debug、Profile、Release,三个文件夹中分别有App.frameworkFlutter.frameworkFlutterPluginRegistrant.framework等多个Framework,命令行界面如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
KKdeMacBook-Pro:kk_flutter kaye$ flutter build ios-framework --output=/Users/kaye/Desktop/ios_flutter/NativeFlutter_module/Flutterframeworks 
Building framework for com.example.kkFlutter in debug mode...
 ├─Populating Flutter.framework...                                 172ms
 ├─Add placeholder App.framework for debug...                      177ms
 ├─Assembling Flutter resources for App.framework...                6.0s
 ├─Building plugins...                                              3.2s
 └─Moving to ../NativeFlutter_module/Flutterframeworks/Debug         0.0s
Building framework for com.example.kkFlutter in profile mode...
 ├─Populating Flutter.framework...                                 124ms
 ├─Building Dart AOT for App.framework...                          20.0s
 ├─Assembling Flutter resources for App.framework...                0.1s
 ├─Building plugins...                                             10.0s
 └─Moving to ../NativeFlutter_module/Flutterframeworks/Profile         0.0s
Building framework for com.example.kkFlutter in release mode...
 ├─Populating Flutter.framework...                                 672ms
 ├─Building Dart AOT for App.framework...                          67.0s
 ├─Assembling Flutter resources for App.framework...                0.1s
 ├─Building plugins...                                              7.9s
 └─Moving to ../NativeFlutter_module/Flutterframeworks/Release         0.0s
Frameworks written to /Users/kaye/Desktop/ios_flutter/NativeFlutter_module/Flutterframeworks.

编译后生成的Framework.png

将生成的三种模式下的Framework拖拽到项目中,并修改Xcode如下配置:

导入flutterFramework.png

然后就可以在Xcode运行了。

4.2 podfile导入

首先,此方法要求在您的项目上工作的每个开发人员都必须具有本地安装的Flutter SDK版本。 只需在Xcode中构建应用程序即可自动运行脚本以嵌入Dart和插件代码。 这允许使用Flutter模块的最新版本进行快速迭代,而无需在Xcode之外运行其他命令。

其次,你的原生项目要有Podfile文件,如果没有你可以通过命令行,进入到原生应用目录中,然后创建Podfile:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
KKdeMacBook-Pro:~ kaye$ cd Desktop/NativeFultter/
KKdeMacBook-Pro:NativeFultter kaye$ ls
NativeFlutter_module    kk_flutter
KKdeMacBook-Pro:NativeFultter kaye$ cd NativeFlutter_module/
KKdeMacBook-Pro:NativeFlutter_module kaye$ ls
NativeFlutter_module        NativeFlutter_moduleTests
NativeFlutter_module.xcodeproj  NativeFlutter_moduleUITests
KKdeMacBook-Pro:NativeFlutter_module kaye$ pod init

目前我们的现有应用程序和flutter_module位于同级目录中。 如果您使用其他目录结构,则可能需要调整相对路径。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
some/path/
├── kk_flutter/ #flutter_module
│   └── .ios/
│       └── Flutter/
│         └── podhelper.rb
└── NativeFlutter_module/ #原生工程
    └── Podfile
  1. 打开我们刚才在原生项目中创建的Podfile文件,将下面两句代码添加到里面:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
flutter_application_path = '../kk_flutter' #这里是我们创建的flutter_module的路径
load File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb')
  1. 对于需要嵌入Flutter的每个Podfile目标,请调用install_all_flutter_pods(flutter_application_path)。整个Podfile文件内容如下:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Uncomment the next line to define a global platform for your project
platform :ios, '9.0'

flutter_application_path = '../kk_flutter' #这里是我们创建的flutter_module的路径
load File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb')

target 'NativeFlutter_module' do
  # Uncomment the next line if you're using Swift or would like to use dynamic frameworks
  # use_frameworks!

  # Pods for NativeFlutter_module

  install_all_flutter_pods(flutter_application_path)

  target 'NativeFlutter_moduleTests' do
    inherit! :search_paths
    # Pods for testing
  end

  target 'NativeFlutter_moduleUITests' do
    inherit! :search_paths
    # Pods for testing
  end

end
  1. 运行pod install
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
KKdeMacBook-Pro:NativeFlutter_module kaye$ pod install
Analyzing dependencies
Fetching podspec for `Flutter` from `../kk_flutter/.ios/Flutter/engine`
Fetching podspec for `FlutterPluginRegistrant` from `../kk_flutter/.ios/Flutter/FlutterPluginRegistrant`
Fetching podspec for `kk_flutter` from `../kk_flutter/.ios/Flutter`
Downloading dependencies
Installing Flutter (1.0.0)
Installing FlutterPluginRegistrant (0.0.1)
Installing kk_flutter (0.0.1)
Generating Pods project
Integrating client project

[!] Please close any current Xcode sessions and use `NativeFlutter_module.xcworkspace` for this project from now on.
Sending stats
Pod installation complete! There are 3 dependencies from the Podfile and 3 total pods installed.
KKdeMacBook-Pro:NativeFlutter_module kaye$ 

Note:当您在kk_flutter/pubspec.yaml中更改Flutter插件的依赖性时,请在flutter_module目录中运flutter pub get来刷新podhelper.rb脚本读取的插件列表。 然后,从您的应用程序的目录下需要再次运行pod install podhelper.rb脚本将您的插件Flutter.frameworkApp.framework嵌入到您的项目中。 Flutter.framework是Flutter引擎的捆绑软件,而App.framework是该项目的已编译Dart代码。

  1. 打开生成的.workspace文件,Command+B,进行build一下,发现貌似没有什么问题。 我们再来看一下目前的Xcode目录:

五、开始使用,启动FlutterEngine和FlutterViewController

要从iOS应用中启动一个Flutter界面,我们必须先创建FlutterEngine和FlutterViewController。

FlutterEngine充当Dart VM和Flutter运行时的主机,FlutterViewController依附于FlutterEngine,以将UIKit输入事件传递到Flutter中并显示FlutterEngine渲染的帧。

FlutterEngine的生存时间大于等于FlutterViewController的生存时间。

通常建议为应用程序预先创建一个长生命周期的FlutterEngine,因为: 显示FlutterViewController时,第一帧显示会更快。 您的Flutter和Dart状态将超过一个FlutterViewController的生存时间。 在显示UI之前,您的应用程序和插件可以与Flutter和Dart逻辑进行交互。

5.1 创建FlutterEngine

考虑到上面所说,预先创建FlutterEngine,我们先在AppDelegate.h中创建一个引擎,并且暴露出来一个属性。然后在AppDelegate.m中注册引擎。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Appdelegate.h
#import <UIKit/UIKit.h>
@import Flutter; // 导入Flutter

@interface AppDelegate : FlutterAppDelegate //UIResponder <UIApplicationDelegate>

//@property (strong, nonatomic) UIWindow *window;
@property (nonatomic, strong) FlutterEngine *flutterEngine;

@end

// AppDelegate.m
#import "AppDelegate.h"
#import <FlutterPluginRegistrant/FlutterPluginRegistrant-umbrella.h> //Used to connect plugins.

@interface AppDelegate ()
@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    
    self.flutterEngine = [[FlutterEngine alloc] initWithName:@"MyFlutterEngine"];
    // 使用默认的Flutter路由运行默认的Dart入口点。
    // 当在AppDelegate中创建的FlutterEngine上调用run时,默认Dart库的默认main()入口点函数将运行。
    [self.flutterEngine run];
    [GeneratedPluginRegistrant registerWithRegistry:self.flutterEngine];
    
    return [super application:application didFinishLaunchingWithOptions:launchOptions];;
}
5.2 创建FlutterViewController

进入我们原生iOS Demo工程中,打开ViewController.h,写入如下代码,测试我们原生打开FlutterViewController。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#import "ViewController.h"
#import "AppDelegate.h"
@import Flutter;

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    UIButton *flutterButton = [[UIButton alloc] initWithFrame:CGRectMake(100, 200, 120, 40)];
    [flutterButton setTitle:@"show flutter" forState:UIControlStateNormal];
    [flutterButton setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
    [flutterButton addTarget:self action:@selector(flutterButtonAction) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:flutterButton];
    
    [self.navigationController setNavigationBarHidden:YES];
}

- (void)flutterButtonAction {
    // 获取引擎
    FlutterEngine *flutterEngine = [(AppDelegate *)[UIApplication sharedApplication].delegate flutterEngine];
    // 创建FlutterViewController
    FlutterViewController *flutterVC = [[FlutterViewController alloc] initWithEngine:flutterEngine nibName:nil bundle:nil];
    // 跳转
    [self.navigationController pushViewController:flutterVC animated:YES];
    // 当然你也可以使用下面的方法跳转
    //[self presentViewController:flutterVC animated:YES completion:nil];
}

至此,我们就已经可以完成原生集成Flutter,并且完成跳转的工作了,效果如下:

另外,官方还给了另外一种使用隐式FlutterEngine的方式创建FlutterViewController,这种方式,我们不需要预先创建FlutterEngine,而去按需创建,尤其是我们Flutter界面很少,而且不知道什么时候会启动Flutter界面的时候,会合适些,但是也牺牲了一些,按照官方说的就是在首次显示FlutterUI的时候,会有些延迟,所以官方不是很推荐隐式创建FlutterEngine的方式。具体代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    UIButton *flutterButton = [[UIButton alloc] initWithFrame:CGRectMake(100, 200, 120, 40)];
    [flutterButton setTitle:@"show flutter" forState:UIControlStateNormal];
    [flutterButton setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
    [flutterButton addTarget:self action:@selector(flutterButtonAction) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:flutterButton];
    
    UIButton *flutterButton2 = [[UIButton alloc] initWithFrame:CGRectMake(100, 300, 200, 40)];
    [flutterButton2 setTitle:@"隐式创建引擎" forState:UIControlStateNormal];
    [flutterButton2 setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
    [flutterButton2 addTarget:self action:@selector(createFlutterViewControllerWithImplicitFlutterEngine) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:flutterButton2];
    
    [self.navigationController setNavigationBarHidden:YES];
}

- (void)createFlutterViewControllerWithImplicitFlutterEngine {
    // 创建FlutterViewController
    FlutterViewController *flutterVC = [[FlutterViewController alloc] initWithProject:nil nibName:nil bundle:nil];
    // 跳转
    [self.navigationController pushViewController:flutterVC animated:YES];
}

六、相关内容的一些说明

6.1 FlutterAppDelegate

有的应用可能不能像我们的demo中那样,直接让AppDelegate继承自FlutterAppDelegate,这种方法是官方推荐,好处就是可以监听到诸如点击状态栏回到顶部此类操作。 但是这并不是强制的,我们在不能直接继承的情况下,为了能够让我们的Flutter能够响应一部分的App生命周期事件,我们可以在AppDelegate.h中遵循FlutterAppLifeCycleProvider,并在AppDelegate.m中实现代理,以确保能够监听到相应的事件行为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// AppDelegate2.h
@import Flutter;
@import UIKit;
@import FlutterPluginRegistrant;

@interface AppDelegate : UIResponder <UIApplicationDelegate, FlutterAppLifeCycleProvider>
@property (strong, nonatomic) UIWindow *window;
@property (nonatomic,strong) FlutterEngine *flutterEngine;
@end

// AppDelegate2.m
#import "AppDelegate2.h"

@interface AppDelegate2 ()

@property (nonatomic, strong) FlutterPluginAppLifeCycleDelegate* lifeCycleDelegate;

@end

@implementation AppDelegate2

- (instancetype)init {
    if (self = [super init]) {
        _lifeCycleDelegate = [[FlutterPluginAppLifeCycleDelegate alloc] init];
    }
    return self;
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    
    self.flutterEngine = [[FlutterEngine alloc] initWithName:@"MyFlutterEngine"];
    // 使用默认的Flutter路由运行默认的Dart入口点。
    // 当在AppDelegate中创建的FlutterEngine上调用run时,默认Dart库的默认main()入口点函数将运行。
    [self.flutterEngine run];
    [GeneratedPluginRegistrant registerWithRegistry:self.flutterEngine];
    
    return [_lifeCycleDelegate application:application didFinishLaunchingWithOptions:launchOptions];
}

// Returns the key window's rootViewController, if it's a FlutterViewController.
// Otherwise, returns nil.
- (FlutterViewController*)rootFlutterViewController {
    UIViewController* viewController = [UIApplication sharedApplication].keyWindow.rootViewController;
    if ([viewController isKindOfClass:[FlutterViewController class]]) {
        return (FlutterViewController*)viewController;
    }
    return nil;
}

- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event {
    [super touchesBegan:touches withEvent:event];
    
    // Pass status bar taps to key window Flutter rootViewController.
    if (self.rootFlutterViewController != nil) {
        [self.rootFlutterViewController handleStatusBarTouches:event];
    }
}
//....
// 这里是生命周期代码,具体的可以参考Demo中AppDelegate2.m
@end
6.2 Dart 入口(Dart EntryPoint)

FlutterEngine调用run方法,默认情况下,运行的是lib/main.dart文件中的main()入口,我们也可以运行不同的入口,通过使用runWithEntrypoint,传入一个字符串参数,以使用其他的dart入口(入口在lib/main.dart文件中),但是请注意,除main()之外的Dart入口点函数必须使用以下注释:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// flutter
@pragma('vm:entry-point')
void myOtherEntryPoint() { ... };

// oc
[self.flutterEngine runWithEntrypoint:@"myOtherEntryPoint"];

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
领域驱动系列三
领域模型是软件项目中的核心,模型是团队经过长时间的归纳总结形成的一个与项目有关的概念集合,他用术语和关系表达了领域的深层含义,这种关系和语义提供了模型语言的语义,模型语言是为领域独家定制的.十分的精确,并且他将开发过程和模型绑定到一起,并使代码和模型紧密的绑定.
郑小超.
2019/01/03
4070
DDD理论学习系列(1)-- 通用语言
1.引言 在开始之前,我想我们有必要先了解以下DDD的主要参与者。因为毕竟语言是人说的吗,就像我们面向对象编程一样,那通用语言面向的是? DDD的主要参与者:领域专家+开发人员 领域专家:精通业务的任何人。 开发人员:开发+测试。 领域专家擅长某个领域的知识,专注于交付的业务价值。 开发人员则注重于技术实现。 开发人员总是想着类、接口、方法、设计模式、架构等。以面向对象的编程思想进行思考,思考如何进行抽象、封装、继承、多态等。而领域专家对软件中的框架、持久化、数据库等没有概念,而这也就导致了他们
圣杰
2018/01/11
1.5K0
领域驱动设计学习之路—DDD的原则与实践
本文是我学习Scott Millett & Nick Tune编著的《领域驱动设计模式、原理与实践》一书的学习笔记,一共会分为4个部分如下,此文为第1部分:
Edison Zhou
2019/05/10
2.1K0
领域驱动设计学习之路—DDD的原则与实践
字节一面挂了,面试官问DDD,我却不知道
在介绍DDD(Domain-Driven Design:领域驱动设计)之前,我们先回顾一下,现阶段的产品迭代中常常出现的一些问题,以及这些问题会导致什么。通过对问题的总结和分析,再回头看一看,DDD能帮我们解决什么?
爪哇缪斯
2023/05/10
4840
字节一面挂了,面试官问DDD,我却不知道
谈一谈 DDD
最近 10 年的互联网发展,从电子商务到移动互联,再到“互联网+”与传统行业的互联网转型,是一个非常痛苦的转型过程。在这个过程中,一方面会给我们带来诸多的挑战,另一方面又会给我们带来无尽的机会,它会带来更多的新兴市场、新兴产业与全新业务,给我们带来全新的发展机遇。然而,在面对全新业务、全新增长点的时候,我们能不能把握住这样的机遇呢?
冬夜先生
2021/12/06
5110
[译文]Domain Driven Design Reference(二)—— 让模型起作用
  很多项目做建模工作最终没有获得太多的实际好处。DDD模式从项目中提炼成功的实践使得建模带来了巨大的好处。总的来说,他们提出了一个与先从细节再到高层次的视角【1,在DDD之前我们大部分都习惯于先进行数据表的设计】完全不同的建模和软件开发的方式。严格的建模惯例必须平衡好与非技术人员【2,一般这里指领域专家】合作进行的模型探索。战术和战略必须结合才能成功,DDD同时涉及战术和战略的设计。
Zachary_ZF
2018/09/10
3480
软件方法(下)第8章分析之分析类图—知识篇Part05(202205更新)领域专家和通用语言
一个领域之所以能作为“领域”为人认知,必定会在发展过程中沉淀出一套日益完善和精确的术语体系。每个术语有其独特的、其他术语不能替代的含义。
用户6288414
2022/05/27
4020
软件方法(下)第8章分析之分析类图—知识篇Part05(202205更新)领域专家和通用语言
领域驱动设计
关于领域驱动设计 这篇文章参考了Eric Evans《领域驱动设计》一书以及Jimmy Nilsson《以C# .NET为例运用领域驱动设计和模式》,二者详细描述了领域驱动设计的核心概念、技术和模式。在某些情况下,直接使用这些书的措辞是有意义的,并且我认为Eric Evans和Jimmy Nilsson也允许我们这么做。 尽管将方法本身呈现出来是很有用的,但是仅仅对方法进行描述,DDD的许多微妙之处就会消失。这些方法应该是你的工具,而不是你束缚你的规则。它们是为设计而生的语言,在团队内沟通创意和模型十分有益
程序猿DD
2018/03/21
1K0
领域驱动设计
DDD开篇总结
对于DDD的启蒙,不管是国内还是国外思维逻辑都是一样的。或者说如果你想写本关于DDD的书,大纲似乎是一样的
码农戏码
2021/03/23
5230
限界上下文是什么鬼?DDD 最抽象的概念详解
- 什么是通用语言 - 通用语言, 最主要的目的就是减少交流中信息丢失, 在实际开发中, 可能关联很多人, 例如有业务层面的业务细节制定者、领域专家、产品经理、项目经理 、架构师、开发
玄姐谈AGI
2021/07/29
6.3K0
DDD领域驱动实战 - 限界上下文(bounded context)
限界上下文定义领域边界,以确保每个上下文含义在它特定的边界内都具有唯一的含义,领域模型则存在于这个边界之内。
JavaEdge
2020/10/02
4.3K0
DDD领域驱动实战 - 限界上下文(bounded context)
[译文]Domain Driven Design Reference(五)—— 为战略设计的上下文映射
  两个组之间的关系是“上游”小组的行为影响“下游”小组的项目成功。但下游的行为并不会显著影响上游项目。(例如,如果两个城市沿着同一条河流,上游城市的污染主要影响下游城市。)
Zachary_ZF
2018/09/10
3580
真下饭!字节技术官DDD(领域驱动设计)手册,拆解业务代码首选
至少20年前,一些顶尖的软件设计人员就已经认识到领域建模和设计的重要性,但令人惊讶的是,这么长时间以来几乎没有人写出点儿什么,告诉大家应该做哪些工作或如何去做。尽管这些工作还没有被清楚地表述出来,但一种新的思潮已经形成,它像一股暗流一样在对象社区中涌动,我把这种思潮称为领域驱动设计(domain-driven design)。
愿天堂没有BUG
2022/10/28
5510
真下饭!字节技术官DDD(领域驱动设计)手册,拆解业务代码首选
领域驱动设计(DDD)部分核心概念
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/03/30
4110
领域驱动模型(DDD)
2004年Eric Evans 发表《领域驱动设计——软件核心复杂性应对之道》(Domain-Driven Design –Tackling Complexity in the Heart of Software),简称Evans DDD,领域驱动设计思想进入软件开发者的视野。领域驱动设计分为两个阶段:
高广超
2018/12/12
3.9K0
走近DDD
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/03/04
4070
重读领域驱动设计——如何说好一门通用语言
在 DDD 中,通用语言是以限界上下文为边界的。如果一个产品或者项目有多个限界上下文,我们就需要为每个限界上下文定义通用语言。
ThoughtWorks
2019/05/05
6740
重读领域驱动设计——如何说好一门通用语言
混合开发:TDD、DDD和BDD交集的值
测试驱动开发(TDD)是一种开发软件的过程,其中在编写代码之前先编写测试。一旦完成,开发人员将努力编写足够的代码以通过测试,然后开始重构。
程序猿玄微子
2020/12/05
2K0
混合开发:TDD、DDD和BDD交集的值
DDD“通用语言”背后的倒退-《软件方法》节选
DDD(领域驱动设计)话语中有“通用语言(Ubiquitous Language)”的用语,这是一个伪创新。
用户6288414
2022/10/31
5020
DDD“通用语言”背后的倒退-《软件方法》节选
领域驱动设计模式的收益与挑战
《软件学报》在2021年第32卷第9期刊登了一篇论文:《领域驱动设计模式的收益与挑战:系统综述》[1]。这篇论文是学术界在这一领域开山之作。
码农戏码
2021/11/18
1.3K0
领域驱动设计模式的收益与挑战
推荐阅读
相关推荐
领域驱动系列三
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验