diff options
| author | muqiuhan <[email protected]> | 2025-03-31 02:02:49 +0000 |
|---|---|---|
| committer | muqiuhan <[email protected]> | 2025-03-31 02:02:49 +0000 |
| commit | 4a6dd951a8e41584d95e04df87bd63bd23b6877a (patch) | |
| tree | 93935496bac2e30bc8743b87c8368a4e6eee06c7 /search.xml | |
| parent | ce98478504ebd13e8f9e6744508968806e8b8b49 (diff) | |
| download | blog-4a6dd951a8e41584d95e04df87bd63bd23b6877a.tar.gz | |
deploy: d690f87fb03551d086dcd146ee9f99bee7a86925
Diffstat (limited to 'search.xml')
| -rw-r--r-- | search.xml | 12 |
1 files changed, 6 insertions, 6 deletions
@@ -3387,7 +3387,7 @@ <hr> <h1 id="在F-中处理复杂依赖注入的实践指南"><a href="#在F-中处理复杂依赖注入的实践指南" class="headerlink" title="在F#中处理复杂依赖注入的实践指南"></a>在F#中处理复杂依赖注入的实践指南</h1><p>依赖注入(DI)是构建松耦合、可维护系统的核心模式。在面向对象语言中,DI框架(如Spring)通过反射和容器管理依赖关系。在 F# 中,则更倾向于利用语言特性(如 Partial Application 和 Type Inference)实现依赖管理。</p> <hr> -<h2 id="一、传统方法:Partial-Application"><a href="#一、传统方法:Partial-Application" class="headerlink" title="一、传统方法:Partial Application"></a>一、传统方法:Partial Application</h2><p>在函数式编程中,Partial Application 是传递依赖的常用方式。例如:</p> +<h2 id="一、传统手艺:Partial-Application"><a href="#一、传统手艺:Partial-Application" class="headerlink" title="一、传统手艺:Partial Application"></a>一、传统手艺:Partial Application</h2><p>在函数式编程中,Partial Application 是传递依赖的常用方式。例如:</p> <figure class="highlight fsharp"><table><tr><td class="code"><pre><span class="line"><span class="keyword">let</span> foo bar baz request <span class="operator">=</span> <span class="operator">...</span></span><br><span class="line"><span class="keyword">let</span> wired <span class="operator">=</span> foo dependency1 dependency2</span><br><span class="line"><span class="keyword">let</span> response <span class="operator">=</span> wired request</span><br></pre></td></tr></table></figure> <p><strong>优点</strong>: </p> @@ -3396,11 +3396,11 @@ <li>符合函数式编程的纯函数理念。</li> </ul> <p><strong>缺点</strong>: </p> -<ol> -<li><strong>参数爆炸</strong>:当功能扩展时,参数数量激增(如日志、数据库、加密等)。 </li> -<li><strong>维护困难</strong>:新增依赖需修改所有调用点的参数传递。 </li> -<li><strong>隐式依赖</strong>:难以从函数签名直接区分核心参数与辅助依赖。</li> -</ol> +<ul> +<li>参数爆炸:当功能扩展时,参数数量激增(如日志、数据库、加密等)。 </li> +<li>维护困难:新增依赖需修改所有调用点的参数传递。 </li> +<li>隐式依赖:难以从函数签名直接区分核心参数与辅助依赖。</li> +</ul> <hr> <h2 id="二、结构化方法:单一环境参数(env)"><a href="#二、结构化方法:单一环境参数(env)" class="headerlink" title="二、结构化方法:单一环境参数(env)"></a>二、结构化方法:单一环境参数(<code>env</code>)</h2><p>为解决参数爆炸问题,可将依赖封装为单一环境对象<code>env</code>,并通过接口约束访问权限:</p> <figure class="highlight fsharp"><table><tr><td class="code"><pre><span class="line"><span class="meta">[<Interface>]</span> <span class="keyword">type</span> <span class="title class_">ILog</span> <span class="operator">=</span> <span class="keyword">abstract</span> Logger<span class="operator">:</span> ILogger</span><br><span class="line"><span class="meta">[<Interface>]</span> <span class="keyword">type</span> <span class="title class_">IDb</span> <span class="operator">=</span> <span class="keyword">abstract</span> Database<span class="operator">:</span> IDatabase</span><br><span class="line"></span><br><span class="line"><span class="keyword">module</span> Log <span class="operator">=</span></span><br><span class="line"> <span class="keyword">let</span> info (env<span class="operator">:</span> #ILog) <span class="operator">=</span> env.Logger.Info(<span class="string">"Message"</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">module</span> Db <span class="operator">=</span></span><br><span class="line"> <span class="keyword">let</span> fetchUser (env<span class="operator">:</span> #IDb) <span class="operator">=</span> env.Database.Query(<span class="operator">...</span>)</span><br></pre></td></tr></table></figure> |
