.NET コードのリファクタリングを思い出す (パート 1)
要件: これは、テキスト メッセージを送信するためのテンプレートを開発する場合に当てはまります。異なる顧客は異なるテンプレートを使用する可能性があり、異なる顧客によって使用される変数パラメーターも異なります。
緊急用にテキストメッセージを送信するためのテキストメッセージテンプレート機能がオンラインで完成し、テキストメッセージテンプレートテーブルも作成され、テーブルに新しいレコードが追加されました。テキスト メッセージ テンプレートを追加、削除、変更、確認するためのインターフェイスを作成するだけで済みます。経験豊富なドライバーであれば、私が混乱したことになることがわかるはずです。
下の図は、最初に作成されたテーブルを示しています
SQL作成スクリプトは次のとおりです:
これに先立って、顧客が呼び出すためのSMSを送信するためのAPIインターフェースが開発されました。つまり、呼び出し元 (顧客) はコードを変更せず、私だけがコードを変更できます。中途半端な仕事を引き受けるのは非常に抵抗があるのですが、開発業務はすべて一からやり直すしかありません。
エンティティクラスのコードは次のとおりです:
DOTクラス:
これは前のコードです。ビジネスエンティティクラスのMessageModuleBusiness.csコードは次のとおりです:
public class MessageModuleBusiness : GenericRepository<Model.MessageModule> { private UnitOfWork.UnitOfWork unitOfWork = new UnitOfWork.UnitOfWork(); /// 获取模版内容 public string GetContent(MessageContext messageContext) { string messageContent = ""; string TypeCode = string.IsNullOrEmpty(messageContext.serviceCode) ? "001" : messageContext.serviceCode; try { var Module = unitOfWork.MessageModule.Get(c => c.Type == messageContext.channel && c.TypeNo == TypeCode).FirstOrDefault(); //Content的内容:【一应生活】您有一件单号为expressNumbers company, 已到communityName收发室,请打开一应生活APP“收发室”获取取件码进行取件。点击下载http://a.app.qq.com/o/simple.jsp?pkgname=com.ening.life if (!string.IsNullOrEmpty(Module.Content)) { var content = Module.Content; content = content.Replace("company", messageContext.company); content = content.Replace("expressNumbers", messageContext.expressNumbers); content = content.Replace("communityName", messageContext.communityName); content = content.Replace("Id", messageContext.Id); content = content.Replace("receiveTime", messageContext.receiveTime); content = content.Replace("fetchCode", messageContext.fetchCode); messageContent = content; } return messageContent; } catch (Exception ex) {} return ""; } #endregion }
MessageContextクラス、これはクライアントによって送信され、呼び出すエンティティ オブジェクトです。オブジェクトにはテキスト メッセージに似た多くの動的タグ変数があります。
public class MessageContext{ /// 手机号码 public string phone { get; set; } /// 发送信息 public string message { get; set; } /// 签名 public string sign { get; set; } /// 渠道 public string channel { get; set; } /// 内容 public string content { get; set; } /// 取件码 public string fetchCode { get; set; } /// 快递公司 public string company { get; set; } /// 快递单号 public string expressNumbers { get; set; } /// 社区名称 public string communityName { get; set; } /// 到件时间 public string receiveTime { get; set; } /// 序号 public string Id { get; set; } /// 业务代码 public string serviceCode { get; set; } }
外部呼び出し用のControllerメソッドexternalMerchantSendMessage
/// 外部商户发送信息 public ActionResult externalMerchantSendMessage(MessageContext param) { logger.Info("[externalMerchantSendMessage]param:" + param); bool isAuth = authModelBusiness.isAuth(param.channel, param.phone, param.sign); if (!isAuth) { return Json(new Result<string>() { resultCode = ((int)ResultCode.NoPermission).ToString(), resultMsg = "签名或无权限访问" }, JsonRequestBehavior.AllowGet); } var meaage = messageModuleBusiness.GetContent(param); if (string.IsNullOrEmpty(meaage)) { return Json(new Result<string>() { resultCode = ((int)ResultCode.failure).ToString(), resultMsg = "发送失败" }, JsonRequestBehavior.AllowGet); } SMSHelper helper = new SMSHelper(); helper.SendSMS(meaage, param.phone); return Json(new Result<string>() { resultCode = ((int)ResultCode.success).ToString(), resultMsg = "发送成功" }, JsonRequestBehavior.AllowGet); }
上記は開発タスクを受け取る前に実装した関数です。私のタスクは非常に単純であるように見えますが、長年の開発経験から、今は何も気にせず、SMS テンプレートを追加、削除、変更、確認するためのインターフェイスを作成するだけであれば、これをリファクタリングする必要があることがわかります。将来の保守担当者は間違いなく発狂するでしょう。
何か問題はありますか?
このインターフェイス メソッド externalMerchantSendMessage はすべての顧客に対して呼び出され、顧客ごとに異なる SMS テンプレートが使用され、テンプレートごとに異なる変数パラメーターが使用されます。現在、すべての変数パラメーターが MessageContext クラスにカプセル化されています。問題は、すべての変数パラメーターを一度に決定して変更せずに維持することができないことです。
つまり、変数パラメーターを追加する必要がある場合は、MessageContext クラスのコードを変更する必要があり、GetContent メソッドのコードはハードコーディングされているため、それに応じて変更する必要があります。これによりサイクルが形成され、変数パラメーターが常に追加され、コードが常に変更され、インターフェイスのバージョンが常にリリースされます...
十分な時間があれば、私は自然に規律あるプログラマーなので...リファクタリングを始めましょう。
リファクタリングの前に頭に浮かぶのは、さまざまな設計パターンではなく、オブジェクト指向設計の基本原則です。さまざまなデザインパターンは、さまざまな武術のルーチンや動きのようなもので、武術家は太極拳の剣を練習する張無忌のように、まずさまざまなルーチンを学び、その後、すべてのルーチンを忘れて習得する必要があります。
なぜなら、動きは死んでいるからです、人は生きているのです。すべての動きには欠点があります。普遍的なデザインパターンがないのと同じように、どんなデザインパターンにも欠点があります。
オブジェクト指向設計の中心的な考え方は、変更をカプセル化することなので、最初に変更点を見つけます。上記の分析から、SMS テンプレート内の可変パラメータである変化点を発見しました。これらの可変パラメータは顧客の呼び出し元によって渡され、異なる顧客によって渡されるパラメータ変数は異なる可能性があります。
まず見てみましょう、顧客から何が渡されるのでしょうか?顧客呼び出しコードを見てみましょう。Get と Post という 2 つの呼び出しメソッドがあります。
function sendMsg() { //var appParam ="phone=15914070649&sign=78a7ce797cf757916c2c7675b6865b54&channel=weijiakeji&content=&fetchCode=1 &company=%E9%A1%BA%E4%B8%B0%E5%BF%AB%E9%80%92&expressNumbers=123456&communityName=%E9%95%BF%E5%9F%8E%E4%B8%80%E8%8A%B1%E5%9B%AD&receiveTime=5&Id=1231"; //Get("/Message/externalMerchantSendMessage?" + appParam, {}); var data = { "phone": "15914070649", "sign": "78a7ce797cf757916c2c7675b6865b54", "channel": "weijiakeji", "fetchCode": 1, "company": "%E9%A1%BA%E4%B8%B0%E5%BF%AB%E9%80%92", "Id": "1231" }; Post('/Message/externalMerchantSendMessage', data); } //WebAPI Post方法 function Post(url, data) { $.ajax({ url: url, contentType: "application/json", type: "POST", dataType: "json", async: true, cache: false, data: JSON.stringify(data), success: function (response) { $('#response').text(JSON.stringify(response)); }, error: function (XMLHttpRequest, textStatus, errorThrown) { alert(textStatus); } }); }; //// WebApi Get方法 function Get(url, data) { $.ajax({ url: url, contentType: "application/json", type: "GET", dataType: "json", async: true, cache: false, //data: JSON.stringify(data), success: function (response) { $('#response').text(JSON.stringify(response)); }, error: function (XMLHttpRequest, textStatus, errorThrown) { alert(textStatus); } }); };
顧客が渡すのは、JSON 形式のオブジェクトであるキーと値のペアのコレクションであることがわかります。前のコード bool isAuth = authModelBusiness.isAuth(param.channel, param.phone, param.sign); によると、すべての発信顧客が渡す必要がある 3 つのパラメーター、つまり、channel、phone、sign があることが分析できます。 , その他のパラメータは、SMS テンプレートの可変パラメータとパラメータ値です。
メソッド externalMerchantSendMessage(MessageContext param) のパラメータは変数オブジェクトです。 C# 4.0 には、可変オブジェクトを記述するために使用されるダイナミックはありませんか?
次に、最初のステップは、受信パラメータのタイプを変更することです。以前は、ハードコーディングされた厳密に型指定された MessageContext でしたが、現在はこのタイプに依存せず、externalMerchantSendMessage メソッドのコードを次のように変更します。 DynamicJsonConverter は JSON の変換に使用されます。文字列は Object オブジェクトに変換されます。コードは次のとおりです。
dynamic param = null; string json = Request.QueryString.ToString(); if (Request.QueryString.Count != 0) //ajax get请求 { //兼容旧的客户调用写法,暂时硬编了 if (json.Contains("param.")) { json = json.Replace("param.", ""); } json = "{" + json.Replace("=", ":'").Replace("&", "',") + "'}"; } else //ajax Post请求 { Request.InputStream.Position = 0; //切记这里必须设置流的起始位置为0,否则无法读取到数据 json = new StreamReader(Request.InputStream).ReadToEnd(); } var serializer = new JavaScriptSerializer(); serializer.RegisterConverters(new[] { new DynamicJsonConverter() }); param = serializer.Deserialize(json, typeof(object));
上記は .NET コードの再構築の内容です (パート 1)。 PHP 中国語 Web サイト (www.php.cn)!

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









C++ 開発におけるコードの冗長性の問題を解決する方法 コードの冗長性とは、プログラムを作成するときに、複数の場所に類似したコードまたは繰り返しのコードが存在することを意味します。この問題により、コードの保守と読み取りが困難になるだけでなく、コードのサイズと複雑さが増大します。 C++ 開発者にとって、コードの冗長性の問題を解決することは特に重要です。C++ は強力なプログラミング言語ですが、コードの重複が容易に発生する可能性があるためです。コードの冗長性の問題の根本原因は、不合理な設計とコーディングの習慣にあります。この問題を解決するには、次の側面から始めることができます: 関数とクラスを使用する: C

時間が経ち、要件が変化すると、プロジェクトのコードは簡単に陳腐化し、保守や拡張が困難になる可能性があります。 PHP 開発では、コードの品質と開発効率を向上させるためにリファクタリングは必要な作業の 1 つと考えられています。このプロセスでは、Rector ツールを使用すると、コードの再構築と最適化作業を大幅に簡素化できます。 Rector は、PHP 開発者がコードの再構築と最適化を自動化するのに役立つオープンソースの PHP コード再構築ツールで、開発者はビジネス開発と機能の実装により集中できるようになります。合格

現在、人工知能(AI)技術の開発は本格化しており、さまざまな分野で大きな可能性と影響力を発揮しています。本日、Dayao は、参考にしていただけるよう、4 つの .NET オープン ソース AI モデル LLM 関連プロジェクト フレームワークを共有します。 https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.mdSemanticKernelSemanticKernel は、OpenAI、Azure などの大規模言語モデル (LLM) を統合するように設計されたオープン ソース ソフトウェア開発キット (SDK) です。

リファクタリングは、PHP コードを作成する際の非常に重要なプロセスです。アプリケーションが成長するにつれて、コード ベースが大きくなり、読み取りや保守が困難になります。リファクタリングは、この問題を解決し、コードをよりモジュール化し、より適切に組織化して拡張可能にすることです。コードをリファクタリングするときは、次の側面を考慮する必要があります。 コード スタイル コード スタイルは非常に重要な点です。コーディング スタイルの一貫性を維持すると、コードが読みやすく、保守しやすくなります。 PHP コーディング標準に従い、一貫性を保ってください。 PHPなどのコードスタイルチェックツールを使ってみる

Java 開発: コードのリファクタリングと品質評価 はじめに: ソフトウェア開発のプロセスにおいて、コードのリファクタリングは、コードの品質と保守性を向上させる重要な手段の 1 つです。コードをリファクタリングすることにより、コードをより洗練され、簡潔にし、理解しやすく、変更しやすくすることができます。ただし、リファクタリングは単にコードを変更するだけではなく、合理的かつ体系的な思考が必要なプロセスです。この記事では、コードのリファクタリングを実行する方法を紹介し、具体的なコード例で説明します。また、コードの品質を評価する方法と評価が重要な理由についても説明します。重いコード

Go 言語の戻り値の型推論は、関数の戻り値の型を自動的に推論し、コードを簡素化し、読みやすさを向上させます。戻り値の型は省略でき、コンパイラは関数本体内の実際の戻り値に基づいて型を自動的に推測します。既存のコードをリファクタリングして、明示的な型宣言を排除するために使用できます。たとえば、整数の配列の合計を計算する関数 CalculateTotal は、funccalculateTotal(items[]int){} にリファクタリングできます。

Go 言語を使用してコード リファクタリングの実践を始める方法: ソフトウェア開発プロセスでは、コードのリファクタリングという課題に直面することがよくあります。コードのリファクタリングとは、コードの品質と保守性を向上させるために、既存のコードを最適化および再構築することを指します。この記事では、コードのリファクタリングの練習に Go 言語を使用する方法と、対応するコード例を紹介します。 1. コードリファクタリングの原則 コードリファクタリングの前に、リファクタリングをスムーズに進めるためにいくつかの原則を明確にする必要があります。コードのリファクタリングに関する重要な原則を次に示します。 コード機能の一貫性を維持する: リファクタリング後
