{"id":1448,"date":"2026-01-21T15:04:33","date_gmt":"2026-01-21T07:04:33","guid":{"rendered":"http:\/\/www.preluna.xyz\/?p=1448"},"modified":"2026-01-25T01:18:31","modified_gmt":"2026-01-24T17:18:31","slug":"1448","status":"publish","type":"post","link":"http:\/\/www.preluna.xyz\/index.php\/2026\/01\/21\/1448\/preluna\/technology\/career-skills\/technology-horizon\/","title":{"rendered":"\u7b2c\u4e94\u5341\u4e5d\u8bfe\uff1a\u7ed3\u6784\u4f53\u4e0e\u7ec4\u5408\u6570\u636e &#8211; \u6570\u636e\u5efa\u6a21\u7684\u827a\u672f"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">\u7b2c\u4e94\u5341\u4e5d\u8bfe\uff1a\u7ed3\u6784\u4f53\u4e0e\u7ec4\u5408\u6570\u636e &#8211; \u6570\u636e\u5efa\u6a21\u7684\u827a\u672f<\/h2>\n\n\n\n<h2 class=\"wp-block-heading\">\u524d\u8a00\uff1a\u4ece\u79bb\u6563\u6570\u636e\u5230\u7ed3\u6784\u5316\u601d\u7ef4<\/h2>\n\n\n\n<p>\u5728\u8f6f\u4ef6\u5f00\u53d1\u4e2d\uff0c\u6570\u636e\u5982\u540c\u5efa\u7b51\u4e2d\u7684\u7816\u77f3\uff0c\u5982\u4f55\u7ec4\u7ec7\u548c\u7ba1\u7406\u6570\u636e\u76f4\u63a5\u51b3\u5b9a\u4e86\u7a0b\u5e8f\u7684\u8d28\u91cf\u548c\u53ef\u7ef4\u62a4\u6027\u3002\u4ece\u7b80\u5355\u7684\u53d8\u91cf\u5230\u590d\u6742\u7684\u7ed3\u6784\u4f53\uff0c\u4ece\u9762\u5411\u5bf9\u8c61\u5230\u51fd\u6570\u5f0f\u7f16\u7a0b\uff0c\u6570\u636e\u7ec4\u7ec7\u65b9\u5f0f\u4e00\u76f4\u5728\u4e0d\u65ad\u6f14\u8fdb\u3002<\/p>\n\n\n\n<p><strong>\u7ed3\u6784\u4f53\uff08Structs\uff09<\/strong> \u548c <strong>\u7ec4\u5408\u6570\u636e\uff08Composite Data\uff09<\/strong> \u662f\u6570\u636e\u5efa\u6a21\u7684\u6838\u5fc3\u6982\u5ff5\uff0c\u5b83\u4eec\u5141\u8bb8\u6211\u4eec\u5c06\u76f8\u5173\u7684\u6570\u636e\u9879\u7ec4\u5408\u5728\u4e00\u8d77\uff0c\u5f62\u6210\u6709\u610f\u4e49\u7684\u6574\u4f53\u3002\u4eceC\u8bed\u8a00\u7684\u7ed3\u6784\u4f53\u5230Rust\u7684struct\uff0c\u4ecePython\u7684\u6570\u636e\u7c7b\u5230TypeScript\u7684\u63a5\u53e3\uff0c\u8fd9\u4e9b\u6280\u672f\u8ba9\u6211\u4eec\u7684\u4ee3\u7801\u66f4\u52a0\u6e05\u6670\u3001\u7c7b\u578b\u66f4\u52a0\u5b89\u5168\u3001\u6570\u636e\u7ed3\u6784\u66f4\u52a0\u5408\u7406\u3002<\/p>\n\n\n\n<p>\u4eca\u5929\uff0c\u6211\u4eec\u5c06\u6df1\u5165\u63a2\u7d22\u7ed3\u6784\u4f53\u548c\u7ec4\u5408\u6570\u636e\u7684\u4e16\u754c\uff0c\u5b66\u4e60\u5982\u4f55\u5728\u4e0d\u540c\u7684\u7f16\u7a0b\u8303\u5f0f\u4e2d\u6709\u6548\u5730\u7ec4\u7ec7\u548c\u64cd\u4f5c\u590d\u6742\u6570\u636e\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u7b2c\u4e00\u90e8\u5206\uff1a\u7ed3\u6784\u4f53\u7684\u57fa\u7840\u6982\u5ff5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1.1 \u7ed3\u6784\u4f53\u7684\u672c\u8d28\uff1a\u4ece\u5185\u5b58\u5e03\u5c40\u5230\u8bed\u4e49\u7ec4\u5408<\/h3>\n\n\n\n<p>\u7ed3\u6784\u4f53\u7684\u672c\u8d28\u662f\u5c06\u591a\u4e2a\u76f8\u5173\u7684\u6570\u636e\u9879\u7ec4\u5408\u6210\u4e00\u4e2a\u903b\u8f91\u5355\u5143\uff0c\u8fd9\u4e2a\u5355\u5143\u5728\u5185\u5b58\u4e2d\u662f\u8fde\u7eed\u5b58\u50a8\u7684\uff0c\u5728\u8bed\u4e49\u4e0a\u662f\u5b8c\u6574\u7684\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># ============================================================================\n# \u7ed3\u6784\u4f53\u7684\u672c\u8d28\uff1a\u4ece\u5185\u5b58\u5e03\u5c40\u5230\u8bed\u4e49\u7ec4\u5408\n# ============================================================================\n\nprint(\"=== \u7ed3\u6784\u4f53\u7684\u672c\u8d28\uff1a\u4ece\u5185\u5b58\u5e03\u5c40\u5230\u8bed\u4e49\u7ec4\u5408 ===\")\n\ndef demonstrate_struct_essence():\n    \"\"\"\u6f14\u793a\u7ed3\u6784\u4f53\u7684\u672c\u8d28\"\"\"\n\n    print(\"\u7ed3\u6784\u4f53\u89e3\u51b3\u7684\u4e94\u4e2a\u6838\u5fc3\u95ee\u9898\uff1a\")\n    print(\"1. \u6570\u636e\u7ec4\u7ec7\u95ee\u9898\uff1a\u5c06\u76f8\u5173\u6570\u636e\u7ec4\u5408\u5728\u4e00\u8d77\")\n    print(\"2. \u5185\u5b58\u5e03\u5c40\u95ee\u9898\uff1a\u4f18\u5316\u5185\u5b58\u8bbf\u95ee\u6a21\u5f0f\")\n    print(\"3. \u7c7b\u578b\u5b89\u5168\uff1a\u660e\u786e\u6570\u636e\u7684\u7c7b\u578b\u548c\u7ed3\u6784\")\n    print(\"4. \u62bd\u8c61\u5c42\u6b21\uff1a\u63d0\u9ad8\u4ee3\u7801\u7684\u62bd\u8c61\u5c42\u6b21\")\n    print(\"5. \u6570\u636e\u5b8c\u6574\u6027\uff1a\u7ef4\u62a4\u76f8\u5173\u6570\u636e\u7684\u5b8c\u6574\u6027\")\n\n    # \u7ed3\u6784\u4f53\u5728\u4e0d\u540c\u8bed\u8a00\u4e2d\u7684\u53d1\u5c55\n    print(\"\\n\u7ed3\u6784\u4f53\u5728\u4e0d\u540c\u8bed\u8a00\u4e2d\u7684\u53d1\u5c55\u5386\u7a0b\uff1a\")\n\n    timeline = &#91;\n        (\"1972\", \"C\u8bed\u8a00\", \"struct\u5173\u952e\u5b57\", \"\u5185\u5b58\u8fde\u7eed\u5e03\u5c40\u7684\u590d\u5408\u7c7b\u578b\"),\n        (\"1979\", \"C++\", \"struct\u6269\u5c55\u4e3a\u7c7b\", \"\u652f\u6301\u6210\u5458\u51fd\u6570\u3001\u7ee7\u627f\u7b49\"),\n        (\"1995\", \"Java\", \"\u53ea\u6709\u7c7b\uff0c\u6ca1\u6709struct\", \"\u4e00\u5207\u7686\u5bf9\u8c61\"),\n        (\"1996\", \"Python 1.0\", \"\u5b57\u5178\u548c\u7c7b\", \"\u52a8\u6001\u7ed3\u6784\uff0c\u8fd0\u884c\u65f6\u5b9a\u4e49\"),\n        (\"2000\", \"C#\", \"struct\u503c\u7c7b\u578b\", \"\u8f7b\u91cf\u7ea7\u6570\u636e\u5bb9\u5668\"),\n        (\"2010\", \"Go\", \"struct\u503c\u7c7b\u578b\", \"\u7ec4\u5408\u4f18\u4e8e\u7ee7\u627f\"),\n        (\"2015\", \"Rust\", \"struct + trait\", \"\u5185\u5b58\u5b89\u5168\u7684\u6240\u6709\u6743\u7cfb\u7edf\"),\n        (\"2017\", \"Python 3.7\", \"dataclass\", \"\u81ea\u52a8\u751f\u6210\u65b9\u6cd5\u7684\u7c7b\u88c5\u9970\u5668\"),\n    ]\n\n    for year, language, feature, description in timeline:\n        print(f\"  {year}: {language:10} | {feature:25} | {description}\")\n\n    # \u4e0d\u540c\u8bed\u8a00\u7684\u7ed3\u6784\u4f53\u5b9e\u73b0\u5bf9\u6bd4\n    print(\"\\n\u4e0d\u540c\u8bed\u8a00\u7684\u7ed3\u6784\u4f53\u5b9e\u73b0\uff1a\")\n\n    implementations = {\n        \"C\u8bed\u8a00\": {\n            \"\u7279\u70b9\": \"\u5185\u5b58\u5e03\u5c40\u7d27\u51d1\uff0c\u624b\u52a8\u5185\u5b58\u7ba1\u7406\",\n            \"\u793a\u4f8b\": \"\"\"\nstruct Point {\n    int x;\n    int y;\n};\n\nstruct Rectangle {\n    struct Point top_left;\n    struct Point bottom_right;\n    int area;\n};\n\n\/\/ \u4f7f\u7528\nstruct Point p = {10, 20};\nstruct Rectangle rect = {{0, 0}, {10, 10}, 100};\nprintf(\"Point: (%d, %d)\\\\n\", p.x, p.y);\n\"\"\",\n            \"\u5185\u5b58\u5e03\u5c40\": \"\"\"\n+-----------------+\n| Point (8\u5b57\u8282)   |\n|   x: 4\u5b57\u8282      |\n|   y: 4\u5b57\u8282      |\n+-----------------+\n| Rectangle (20\u5b57\u8282)|\n|   top_left      |\n|     x: 4\u5b57\u8282    |\n|     y: 4\u5b57\u8282    |\n|   bottom_right  |\n|     x: 4\u5b57\u8282    |\n|     y: 4\u5b57\u8282    |\n|   area: 4\u5b57\u8282   |\n+-----------------+\n\"\"\"\n        },\n        \"C++\": {\n            \"\u7279\u70b9\": \"\u53ef\u5305\u542b\u6210\u5458\u51fd\u6570\uff0c\u652f\u6301\u8bbf\u95ee\u63a7\u5236\",\n            \"\u793a\u4f8b\": \"\"\"\nstruct Point {\n    int x;\n    int y;\n\n    \/\/ \u6784\u9020\u51fd\u6570\n    Point(int x, int y) : x(x), y(y) {}\n\n    \/\/ \u6210\u5458\u51fd\u6570\n    void move(int dx, int dy) {\n        x += dx;\n        y += dy;\n    }\n\n    \/\/ \u8fd0\u7b97\u7b26\u91cd\u8f7d\n    Point operator+(const Point&amp; other) const {\n        return Point(x + other.x, y + other.y);\n    }\n};\n\n\/\/ \u4f7f\u7528\nPoint p1(10, 20);\nPoint p2(30, 40);\nPoint p3 = p1 + p2;\np3.move(5, 5);\n\"\"\",\n            \"\u5185\u5b58\u5e03\u5c40\": \"\u4e0eC\u7c7b\u4f3c\uff0c\u4f46\u53ef\u80fd\u6709\u865a\u51fd\u6570\u8868\u5f00\u9500\"\n        },\n        \"Go\": {\n            \"\u7279\u70b9\": \"\u503c\u7c7b\u578b\uff0c\u652f\u6301\u65b9\u6cd5\uff0c\u7ec4\u5408\u4f18\u4e8e\u7ee7\u627f\",\n            \"\u793a\u4f8b\": \"\"\"\ntype Point struct {\n    X int\n    Y int\n}\n\n\/\/ \u65b9\u6cd5\nfunc (p Point) Distance() float64 {\n    return math.Sqrt(float64(p.X*p.X + p.Y*p.Y))\n}\n\n\/\/ \u5d4c\u5165\u7ed3\u6784\u4f53\uff08\u7ec4\u5408\uff09\ntype Circle struct {\n    Point  \/\/ \u5d4c\u5165Point\n    Radius int\n}\n\n\/\/ \u4f7f\u7528\np := Point{X: 10, Y: 20}\ndistance := p.Distance()\n\nc := Circle{\n    Point:  Point{X: 5, Y: 5},\n    Radius: 10,\n}\n\/\/ \u53ef\u4ee5\u76f4\u63a5\u8bbf\u95ee\u5d4c\u5165\u5b57\u6bb5\ncenterX := c.X\n\"\"\",\n            \"\u5185\u5b58\u5e03\u5c40\": \"\"\"\n+-----------------+\n| Point (16\u5b57\u8282)  |\n|   X: 8\u5b57\u8282      |  \/\/ Go\u4e2dint\u662f\u5e73\u53f0\u76f8\u5173\u7684\n|   Y: 8\u5b57\u8282      |\n+-----------------+\n| Circle (24\u5b57\u8282) |\n|   Point (16\u5b57\u8282)|\n|   Radius: 8\u5b57\u8282 |\n+-----------------+\n\"\"\"\n        },\n        \"Rust\": {\n            \"\u7279\u70b9\": \"\u6240\u6709\u6743\u7cfb\u7edf\uff0c\u96f6\u6210\u672c\u62bd\u8c61\",\n            \"\u793a\u4f8b\": \"\"\"\n\/\/ \u5b9a\u4e49\u7ed3\u6784\u4f53\nstruct Point {\n    x: i32,\n    y: i32,\n}\n\n\/\/ \u5b9e\u73b0\u65b9\u6cd5\nimpl Point {\n    \/\/ \u5173\u8054\u51fd\u6570\uff08\u7c7b\u4f3c\u9759\u6001\u65b9\u6cd5\uff09\n    fn new(x: i32, y: i32) -&gt; Self {\n        Point { x, y }\n    }\n\n    \/\/ \u5b9e\u4f8b\u65b9\u6cd5\n    fn distance(&amp;self) -&gt; f64 {\n        ((self.x.pow(2) + self.y.pow(2)) as f64).sqrt()\n    }\n\n    \/\/ \u53ef\u53d8\u65b9\u6cd5\n    fn move_by(&amp;mut self, dx: i32, dy: i32) {\n        self.x += dx;\n        self.y += dy;\n    }\n}\n\n\/\/ \u4f7f\u7528\nlet mut p = Point::new(10, 20);\nprintln!(\"Distance: {}\", p.distance());\np.move_by(5, 5);\n\n\/\/ \u5143\u7ec4\u7ed3\u6784\u4f53\nstruct Color(u8, u8, u8);\nlet red = Color(255, 0, 0);\n\"\"\",\n            \"\u5185\u5b58\u5e03\u5c40\": \"\"\"\n+-----------------+\n| Point (8\u5b57\u8282)   |\n|   x: 4\u5b57\u8282      |\n|   y: 4\u5b57\u8282      |\n+-----------------+\n\/\/ \u5185\u5b58\u5e03\u5c40\u4e0eC\u5b8c\u5168\u76f8\u540c\n\"\"\"\n        },\n        \"Python\": {\n            \"\u7279\u70b9\": \"\u52a8\u6001\u7c7b\u578b\uff0c\u591a\u79cd\u5b9e\u73b0\u65b9\u5f0f\",\n            \"\u793a\u4f8b\": \"\"\"\n# 1. \u4f7f\u7528\u666e\u901a\u7c7b\nclass Point:\n    def __init__(self, x, y):\n        self.x = x\n        self.y = y\n\n    def distance(self):\n        return (self.x**2 + self.y**2)**0.5\n\n# 2. \u4f7f\u7528namedtuple\nfrom collections import namedtuple\nPoint2 = namedtuple('Point2', &#91;'x', 'y'])\n\n# 3. \u4f7f\u7528dataclass\uff08Python 3.7+\uff09\nfrom dataclasses import dataclass\n@dataclass\nclass Point3:\n    x: float\n    y: float\n\n    def distance(self):\n        return (self.x**2 + self.y**2)**0.5\n\n# \u4f7f\u7528\np1 = Point(10, 20)\np2 = Point2(10, 20)  # \u4e0d\u53ef\u53d8\np3 = Point3(10.0, 20.0)\n\"\"\",\n            \"\u5185\u5b58\u5e03\u5c40\": \"\u52a8\u6001\uff0c\u6bcf\u4e2a\u5bf9\u8c61\u90fd\u662f\u5b57\u5178\u7684\u5305\u88c5\"\n        },\n        \"TypeScript\": {\n            \"\u7279\u70b9\": \"\u7c7b\u578b\u6807\u6ce8\uff0c\u7f16\u8bd1\u65f6\u68c0\u67e5\",\n            \"\u793a\u4f8b\": \"\"\"\n\/\/ \u63a5\u53e3\u5b9a\u4e49\u7ed3\u6784\ninterface Point {\n    x: number;\n    y: number;\n}\n\n\/\/ \u7c7b\u578b\u522b\u540d\ntype Rectangle = {\n    topLeft: Point;\n    bottomRight: Point;\n    area: number;\n};\n\n\/\/ \u7c7b\u5b9e\u73b0\nclass PointClass implements Point {\n    constructor(public x: number, public y: number) {}\n\n    distance(): number {\n        return Math.sqrt(this.x**2 + this.y**2);\n    }\n}\n\n\/\/ \u4f7f\u7528\nconst p: Point = { x: 10, y: 20 };\nconst rect: Rectangle = {\n    topLeft: { x: 0, y: 0 },\n    bottomRight: { x: 10, y: 10 },\n    area: 100\n};\n\nconst pc = new PointClass(10, 20);\nconsole.log(pc.distance());\n\"\"\",\n            \"\u5185\u5b58\u5e03\u5c40\": \"JavaScript\u5bf9\u8c61\uff0c\u8fd0\u884c\u65f6\u52a8\u6001\"\n        }\n    }\n\n    for lang, info in implementations.items():\n        print(f\"\\n{lang}:\")\n        print(f\"  \u7279\u70b9: {info&#91;'\u7279\u70b9']}\")\n        print(f\"  \u793a\u4f8b: {info&#91;'\u793a\u4f8b'].strip()}\")\n        if '\u5185\u5b58\u5e03\u5c40' in info:\n            print(f\"  \u5185\u5b58\u5e03\u5c40: {info&#91;'\u5185\u5b58\u5e03\u5c40'].strip()}\")\n\n    # \u7ed3\u6784\u4f53\u7684\u56db\u4e2a\u6838\u5fc3\u4ef7\u503c\n    print(\"\\n\u7ed3\u6784\u4f53\u7684\u56db\u4e2a\u6838\u5fc3\u4ef7\u503c\uff1a\")\n\n    values = &#91;\n        (\"\u6570\u636e\u5b8c\u6574\u6027\", \"\u76f8\u5173\u6570\u636e\u9879\u7ec4\u7ec7\u5728\u4e00\u8d77\", \"\u4fdd\u8bc1\u6570\u636e\u7684\u5b8c\u6574\u6027\u548c\u4e00\u81f4\u6027\"),\n        (\"\u4ee3\u7801\u53ef\u8bfb\u6027\", \"\u6709\u610f\u4e49\u7684\u7c7b\u578b\u540d\u79f0\u548c\u5b57\u6bb5\u540d\", \"\u63d0\u9ad8\u4ee3\u7801\u7684\u53ef\u8bfb\u6027\u548c\u53ef\u7ef4\u62a4\u6027\"),\n        (\"\u5185\u5b58\u6548\u7387\", \"\u8fde\u7eed\u5185\u5b58\u5e03\u5c40\", \"\u63d0\u9ad8\u7f13\u5b58\u5229\u7528\u7387\u548c\u8bbf\u95ee\u901f\u5ea6\"),\n        (\"\u7c7b\u578b\u5b89\u5168\", \"\u7f16\u8bd1\u65f6\u7c7b\u578b\u68c0\u67e5\", \"\u51cf\u5c11\u8fd0\u884c\u65f6\u9519\u8bef\"),\n    ]\n\n    for value, mechanism, benefit in values:\n        print(f\"  \u2022 {value:15} | {mechanism:25} | -&gt; {benefit}\")\n\n# \u8fd0\u884c\u6f14\u793a\ndemonstrate_struct_essence()<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">1.2 Python\u4e2d\u7684\u7ed3\u6784\u4f53\u5b9e\u73b0\u65b9\u5f0f<\/h3>\n\n\n\n<p>Python\u4f5c\u4e3a\u52a8\u6001\u7c7b\u578b\u8bed\u8a00\uff0c\u63d0\u4f9b\u4e86\u591a\u79cd\u65b9\u5f0f\u6765\u5b9e\u73b0\u7ed3\u6784\u4f53\u7684\u6982\u5ff5\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># ============================================================================\n# Python\u4e2d\u7684\u7ed3\u6784\u4f53\u5b9e\u73b0\u65b9\u5f0f\n# ============================================================================\n\nprint(\"\\n=== Python\u4e2d\u7684\u7ed3\u6784\u4f53\u5b9e\u73b0\u65b9\u5f0f ===\")\n\ndef demonstrate_python_structs():\n    \"\"\"\u6f14\u793aPython\u4e2d\u5b9e\u73b0\u7ed3\u6784\u4f53\u7684\u591a\u79cd\u65b9\u5f0f\"\"\"\n\n    import sys\n    from collections import namedtuple\n    from dataclasses import dataclass, field, asdict, astuple\n    from typing import List, Optional, ClassVar\n    import json\n\n    # 1. \u4f7f\u7528\u666e\u901a\u7c7b\n    print(\"1. \u4f7f\u7528\u666e\u901a\u7c7b\uff1a\")\n\n    class PointClassic:\n        \"\"\"\u4f20\u7edf\u7684\u7c7b\u5b9e\u73b0\"\"\"\n        def __init__(self, x: float, y: float):\n            self.x = x\n            self.y = y\n\n        def distance(self) -&gt; float:\n            \"\"\"\u8ba1\u7b97\u5230\u539f\u70b9\u7684\u8ddd\u79bb\"\"\"\n            return (self.x**2 + self.y**2)**0.5\n\n        def __repr__(self):\n            return f\"PointClassic(x={self.x}, y={self.y})\"\n\n    print(\"\u4f20\u7edf\u7c7b\u7684\u4f18\u7f3a\u70b9\uff1a\")\n    print(\"  \u4f18\u70b9: \u5b8c\u5168\u63a7\u5236\uff0c\u53ef\u6dfb\u52a0\u4efb\u610f\u65b9\u6cd5\")\n    print(\"  \u7f3a\u70b9: \u9700\u8981\u624b\u52a8\u5b9e\u73b0__repr__, __eq__\u7b49\u65b9\u6cd5\")\n    print(\"  \u5927\u5c0f: \u6bcf\u4e2a\u5b9e\u4f8b\u90fd\u6709\u4e00\u4e2a__dict__\uff0c\u5185\u5b58\u5f00\u9500\u5927\")\n\n    p1 = PointClassic(3.0, 4.0)\n    p2 = PointClassic(3.0, 4.0)\n    print(f\"  \u793a\u4f8b: {p1}\")\n    print(f\"  \u8ddd\u79bb: {p1.distance()}\")\n    print(f\"  \u76f8\u7b49\u6bd4\u8f83: {p1 == p2}\")  # False\uff0c\u56e0\u4e3a\u6ca1\u6709\u5b9e\u73b0__eq__\n    print(f\"  \u5185\u5b58\u5927\u5c0f: {sys.getsizeof(p1)} \u5b57\u8282 + __dict__\u5f00\u9500\")\n\n    # 2. \u4f7f\u7528__slots__\u4f18\u5316\u5185\u5b58\n    print(\"\\n2. \u4f7f\u7528__slots__\u4f18\u5316\u5185\u5b58\uff1a\")\n\n    class PointSlots:\n        \"\"\"\u4f7f\u7528__slots__\u51cf\u5c11\u5185\u5b58\u5360\u7528\"\"\"\n        __slots__ = ('x', 'y')  # \u56fa\u5b9a\u5c5e\u6027\u5217\u8868\n\n        def __init__(self, x: float, y: float):\n            self.x = x\n            self.y = y\n\n        def distance(self) -&gt; float:\n            return (self.x**2 + self.y**2)**0.5\n\n        def __repr__(self):\n            return f\"PointSlots(x={self.x}, y={self.y})\"\n\n    print(\"__slots__\u7684\u4f18\u7f3a\u70b9\uff1a\")\n    print(\"  \u4f18\u70b9: \u5185\u5b58\u6548\u7387\u9ad8\uff0c\u8bbf\u95ee\u901f\u5ea6\u5feb\")\n    print(\"  \u7f3a\u70b9: \u4e0d\u80fd\u52a8\u6001\u6dfb\u52a0\u5c5e\u6027\uff0c\u7ee7\u627f\u65f6\u9700\u8981\u5c0f\u5fc3\")\n\n    p_slots = PointSlots(3.0, 4.0)\n    print(f\"  \u793a\u4f8b: {p_slots}\")\n    print(f\"  \u5185\u5b58\u5927\u5c0f: {sys.getsizeof(p_slots)} \u5b57\u8282\")\n    print(f\"  \u5185\u5b58\u8282\u7701: \u7ea6 {sys.getsizeof(p1) - sys.getsizeof(p_slots)} \u5b57\u8282\")\n\n    # 3. \u4f7f\u7528namedtuple\n    print(\"\\n3. \u4f7f\u7528namedtuple\uff1a\")\n\n    # \u521b\u5efa\u547d\u540d\u5143\u7ec4\n    PointNamedTuple = namedtuple('PointNamedTuple', &#91;'x', 'y'])\n\n    # \u4e5f\u53ef\u4ee5\u6dfb\u52a0\u65b9\u6cd5\n    class PointNamedTupleWithMethods(PointNamedTuple):\n        \"\"\"\u5e26\u65b9\u6cd5\u7684\u547d\u540d\u5143\u7ec4\"\"\"\n        def distance(self):\n            return (self.x**2 + self.y**2)**0.5\n\n        def move(self, dx: float, dy: float):\n            return PointNamedTupleWithMethods(self.x + dx, self.y + dy)\n\n    print(\"namedtuple\u7684\u4f18\u7f3a\u70b9\uff1a\")\n    print(\"  \u4f18\u70b9: \u4e0d\u53ef\u53d8\uff0c\u7ebf\u7a0b\u5b89\u5168\uff0c\u81ea\u5e26__repr__, __eq__\u7b49\")\n    print(\"  \u7f3a\u70b9: \u4e0d\u53ef\u53d8\uff0c\u4e0d\u80fd\u6dfb\u52a0\u65b0\u5b57\u6bb5\")\n\n    p_nt = PointNamedTuple(3.0, 4.0)\n    p_nt2 = PointNamedTupleWithMethods(3.0, 4.0)\n    print(f\"  \u793a\u4f8b: {p_nt}\")\n    print(f\"  \u5b57\u6bb5\u8bbf\u95ee: x={p_nt.x}, y={p_nt.y}\")\n    print(f\"  \u7d22\u5f15\u8bbf\u95ee: &#91;0]={p_nt&#91;0]}, &#91;1]={p_nt&#91;1]}\")\n    print(f\"  \u89e3\u5305: x, y = p_nt -&gt; {p_nt}\")\n    print(f\"  \u5e26\u65b9\u6cd5\u7684\u7248\u672c: {p_nt2.distance()}\")\n    print(f\"  \u4e0d\u53ef\u53d8\u6027\u6d4b\u8bd5: \u4e0d\u80fd\u4fee\u6539 p_nt.x = 5.0\")\n    print(f\"  \u5185\u5b58\u5927\u5c0f: {sys.getsizeof(p_nt)} \u5b57\u8282\")\n\n    # 4. \u4f7f\u7528dataclass\uff08Python 3.7+\uff09\n    print(\"\\n4. \u4f7f\u7528dataclass\uff08\u63a8\u8350\u65b9\u5f0f\uff09\uff1a\")\n\n    @dataclass\n    class PointDataClass:\n        \"\"\"\u4f7f\u7528dataclass\u7684\u6570\u636e\u7c7b\"\"\"\n        x: float\n        y: float\n\n        def distance(self) -&gt; float:\n            return (self.x**2 + self.y**2)**0.5\n\n    @dataclass(order=True)  # \u751f\u6210\u6bd4\u8f83\u65b9\u6cd5\n    class PointWithOrder:\n        \"\"\"\u53ef\u6392\u5e8f\u7684dataclass\"\"\"\n        x: float\n        y: float\n\n        def __post_init__(self):\n            \"\"\"\u521d\u59cb\u5316\u540e\u5904\u7406\"\"\"\n            if self.x &lt; 0 or self.y &lt; 0:\n                print(f\"\u8b66\u544a: \u5750\u6807({self.x}, {self.y})\u5305\u542b\u8d1f\u6570\")\n\n    @dataclass(frozen=True)  # \u4e0d\u53ef\u53d8\n    class ImmutablePoint:\n        \"\"\"\u4e0d\u53ef\u53d8\u7684\u70b9\"\"\"\n        x: float\n        y: float\n\n    print(\"dataclass\u7684\u4f18\u7f3a\u70b9\uff1a\")\n    print(\"  \u4f18\u70b9: \u81ea\u52a8\u751f\u6210__init__, __repr__, __eq__\u7b49\uff0c\u7c7b\u578b\u63d0\u793a\")\n    print(\"  \u7f3a\u70b9: Python 3.7+\uff0c\u67d0\u4e9b\u9ad8\u7ea7\u7279\u6027\u9700\u8981\u624b\u52a8\u5904\u7406\")\n\n    p_dc = PointDataClass(3.0, 4.0)\n    p_dc2 = PointDataClass(3.0, 4.0)\n    print(f\"  \u793a\u4f8b: {p_dc}\")\n    print(f\"  \u81ea\u52a8\u76f8\u7b49\u6bd4\u8f83: {p_dc == p_dc2}\")\n    print(f\"  \u8ddd\u79bb\u8ba1\u7b97: {p_dc.distance()}\")\n    print(f\"  \u5185\u5b58\u5927\u5c0f: {sys.getsizeof(p_dc)} \u5b57\u8282\")\n\n    # \u6392\u5e8f\u793a\u4f8b\n    points = &#91;\n        PointWithOrder(3.0, 4.0),\n        PointWithOrder(1.0, 2.0),\n        PointWithOrder(5.0, 0.0),\n    ]\n    print(f\"  \u6392\u5e8f\u524d: {points}\")\n    print(f\"  \u6392\u5e8f\u540e: {sorted(points)}\")\n\n    # \u4e0d\u53ef\u53d8\u793a\u4f8b\n    p_immutable = ImmutablePoint(3.0, 4.0)\n    print(f\"  \u4e0d\u53ef\u53d8\u70b9: {p_immutable}\")\n    try:\n        p_immutable.x = 5.0  # \u5e94\u8be5\u5931\u8d25\n    except Exception as e:\n        print(f\"  \u4fee\u6539\u4e0d\u53ef\u53d8\u70b9\u5931\u8d25: {type(e).__name__}\")\n\n    # 5. \u4f7f\u7528Pydantic\uff08\u6570\u636e\u9a8c\u8bc1\uff09\n    print(\"\\n5. \u4f7f\u7528Pydantic\uff08\u6570\u636e\u9a8c\u8bc1\uff09\uff1a\")\n\n    try:\n        from pydantic import BaseModel, Field, validator\n\n        class PointPydantic(BaseModel):\n            \"\"\"\u4f7f\u7528Pydantic\u7684\u6a21\u578b\"\"\"\n            x: float = Field(..., description=\"X\u5750\u6807\", ge=0)  # \u5fc5\u987b\u5927\u4e8e\u7b49\u4e8e0\n            y: float = Field(..., description=\"Y\u5750\u6807\", ge=0)\n\n            @validator('x', 'y')\n            def validate_coordinates(cls, v):\n                if v &gt; 1000:\n                    raise ValueError('\u5750\u6807\u503c\u592a\u5927')\n                return v\n\n            def distance(self) -&gt; float:\n                return (self.x**2 + self.y**2)**0.5\n\n            class Config:\n                \"\"\"\u914d\u7f6e\"\"\"\n                frozen = True  # \u4e0d\u53ef\u53d8\n\n        print(\"Pydantic\u7684\u4f18\u7f3a\u70b9\uff1a\")\n        print(\"  \u4f18\u70b9: \u5f3a\u5927\u7684\u6570\u636e\u9a8c\u8bc1\uff0cJSON\u5e8f\u5217\u5316\uff0c\u6587\u6863\u751f\u6210\")\n        print(\"  \u7f3a\u70b9: \u9700\u8981\u989d\u5916\u4f9d\u8d56\uff0c\u6709\u4e00\u5b9a\u7684\u6027\u80fd\u5f00\u9500\")\n\n        # \u6709\u6548\u6570\u636e\n        p_pydantic = PointPydantic(x=3.0, y=4.0)\n        print(f\"  \u6709\u6548\u793a\u4f8b: {p_pydantic}\")\n        print(f\"  JSON\u5e8f\u5217\u5316: {p_pydantic.json()}\")\n        print(f\"  \u5b57\u5178\u8868\u793a: {p_pydantic.dict()}\")\n        print(f\"  \u6a21\u5f0f: {p_pydantic.schema_json(indent=2)}\")\n\n        # \u65e0\u6548\u6570\u636e\n        try:\n            p_invalid = PointPydantic(x=-1.0, y=4.0)\n        except Exception as e:\n            print(f\"  \u65e0\u6548\u6570\u636e\u9a8c\u8bc1: {e}\")\n\n    except ImportError:\n        print(\"  Pydantic\u672a\u5b89\u88c5\uff0c\u8df3\u8fc7\u793a\u4f8b\")\n        print(\"  \u5b89\u88c5: pip install pydantic\")\n\n    # 6. \u4f7f\u7528attrs\u5e93\n    print(\"\\n6. \u4f7f\u7528attrs\u5e93\uff1a\")\n\n    try:\n        import attr\n\n        @attr.s(auto_attribs=True)\n        class PointAttrs:\n            \"\"\"\u4f7f\u7528attrs\u7684\u7c7b\"\"\"\n            x: float\n            y: float\n\n            def distance(self) -&gt; float:\n                return (self.x**2 + self.y**2)**0.5\n\n        print(\"attrs\u7684\u4f18\u7f3a\u70b9\uff1a\")\n        print(\"  \u4f18\u70b9: \u529f\u80fd\u5f3a\u5927\uff0c\u6027\u80fd\u597d\uff0c\u652f\u6301Python 3.6+\")\n        print(\"  \u7f3a\u70b9: \u9700\u8981\u989d\u5916\u4f9d\u8d56\")\n\n        p_attrs = PointAttrs(3.0, 4.0)\n        p_attrs2 = PointAttrs(3.0, 4.0)\n        print(f\"  \u793a\u4f8b: {p_attrs}\")\n        print(f\"  \u81ea\u52a8\u76f8\u7b49\u6bd4\u8f83: {p_attrs == p_attrs2}\")\n        print(f\"  \u54c8\u5e0c\u652f\u6301: {hash(p_attrs)}\")\n        print(f\"  \u5c5e\u6027: {attr.fields(PointAttrs)}\")\n\n    except ImportError:\n        print(\"  attrs\u672a\u5b89\u88c5\uff0c\u8df3\u8fc7\u793a\u4f8b\")\n        print(\"  \u5b89\u88c5: pip install attrs\")\n\n    # 7. \u6027\u80fd\u5bf9\u6bd4\n    print(\"\\n7. \u5404\u79cd\u5b9e\u73b0\u65b9\u5f0f\u7684\u6027\u80fd\u5bf9\u6bd4\uff1a\")\n\n    def performance_test():\n        \"\"\"\u6027\u80fd\u6d4b\u8bd5\"\"\"\n        import time\n\n        # \u521b\u5efa100\u4e07\u4e2a\u70b9\n        n = 100000\n\n        # \u4f20\u7edf\u7c7b\n        start = time.time()\n        points_classic = &#91;PointClassic(i, i) for i in range(n)]\n        classic_time = time.time() - start\n\n        # __slots__\n        start = time.time()\n        points_slots = &#91;PointSlots(i, i) for i in range(n)]\n        slots_time = time.time() - start\n\n        # namedtuple\n        start = time.time()\n        points_nt = &#91;PointNamedTuple(i, i) for i in range(n)]\n        nt_time = time.time() - start\n\n        # dataclass\n        start = time.time()\n        points_dc = &#91;PointDataClass(i, i) for i in range(n)]\n        dc_time = time.time() - start\n\n        print(f\"  \u521b\u5efa {n:,} \u4e2a\u5bf9\u8c61\u7684\u65f6\u95f4\uff1a\")\n        print(f\"    \u4f20\u7edf\u7c7b: {classic_time:.4f} \u79d2\")\n        print(f\"    __slots__: {slots_time:.4f} \u79d2 (\u8282\u7701 {classic_time-slots_time:.4f} \u79d2)\")\n        print(f\"    namedtuple: {nt_time:.4f} \u79d2\")\n        print(f\"    dataclass: {dc_time:.4f} \u79d2\")\n\n        # \u5185\u5b58\u4f7f\u7528\n        if n &lt;= 10000:  # \u907f\u514d\u5185\u5b58\u8fc7\u5927\n            classic_mem = sum(sys.getsizeof(p) for p in points_classic&#91;:1000])\n            slots_mem = sum(sys.getsizeof(p) for p in points_slots&#91;:1000])\n            nt_mem = sum(sys.getsizeof(p) for p in points_nt&#91;:1000])\n            dc_mem = sum(sys.getsizeof(p) for p in points_dc&#91;:1000])\n\n            print(f\"\\n  1000\u4e2a\u5bf9\u8c61\u7684\u5185\u5b58\u4f7f\u7528\uff1a\")\n            print(f\"    \u4f20\u7edf\u7c7b: {classic_mem:,} \u5b57\u8282\")\n            print(f\"    __slots__: {slots_mem:,} \u5b57\u8282 (\u8282\u7701 {classic_mem-slots_mem:,} \u5b57\u8282)\")\n            print(f\"    namedtuple: {nt_mem:,} \u5b57\u8282\")\n            print(f\"    dataclass: {dc_mem:,} \u5b57\u8282\")\n\n    # \u8fd0\u884c\u6027\u80fd\u6d4b\u8bd5\n    performance_test()\n\n    # 8. \u5b9e\u9645\u5e94\u7528\u793a\u4f8b\n    print(\"\\n8. \u5b9e\u9645\u5e94\u7528\u793a\u4f8b\uff1a\u51e0\u4f55\u56fe\u5f62\u7cfb\u7edf\")\n\n    @dataclass\n    class Point:\n        \"\"\"\u70b9\"\"\"\n        x: float\n        y: float\n\n        def distance_to(self, other: 'Point') -&gt; float:\n            \"\"\"\u8ba1\u7b97\u5230\u53e6\u4e00\u4e2a\u70b9\u7684\u8ddd\u79bb\"\"\"\n            return ((self.x - other.x)**2 + (self.y - other.y)**2)**0.5\n\n        def translate(self, dx: float, dy: float) -&gt; 'Point':\n            \"\"\"\u5e73\u79fb\u70b9\"\"\"\n            return Point(self.x + dx, self.y + dy)\n\n    @dataclass\n    class Line:\n        \"\"\"\u7ebf\u6bb5\"\"\"\n        start: Point\n        end: Point\n\n        def length(self) -&gt; float:\n            \"\"\"\u7ebf\u6bb5\u957f\u5ea6\"\"\"\n            return self.start.distance_to(self.end)\n\n        def midpoint(self) -&gt; Point:\n            \"\"\"\u4e2d\u70b9\"\"\"\n            return Point(\n                (self.start.x + self.end.x) \/ 2,\n                (self.start.y + self.end.y) \/ 2\n            )\n\n    @dataclass\n    class Circle:\n        \"\"\"\u5706\"\"\"\n        center: Point\n        radius: float\n\n        def area(self) -&gt; float:\n            \"\"\"\u9762\u79ef\"\"\"\n            import math\n            return math.pi * self.radius ** 2\n\n        def circumference(self) -&gt; float:\n            \"\"\"\u5468\u957f\"\"\"\n            import math\n            return 2 * math.pi * self.radius\n\n        def contains(self, point: Point) -&gt; bool:\n            \"\"\"\u5224\u65ad\u70b9\u662f\u5426\u5728\u5706\u5185\"\"\"\n            return self.center.distance_to(point) &lt;= self.radius\n\n    @dataclass\n    class Rectangle:\n        \"\"\"\u77e9\u5f62\"\"\"\n        top_left: Point\n        width: float\n        height: float\n\n        def area(self) -&gt; float:\n            \"\"\"\u9762\u79ef\"\"\"\n            return self.width * self.height\n\n        def perimeter(self) -&gt; float:\n            \"\"\"\u5468\u957f\"\"\"\n            return 2 * (self.width + self.height)\n\n        def bottom_right(self) -&gt; Point:\n            \"\"\"\u53f3\u4e0b\u89d2\u70b9\"\"\"\n            return Point(\n                self.top_left.x + self.width,\n                self.top_left.y + self.height\n            )\n\n        def contains(self, point: Point) -&gt; bool:\n            \"\"\"\u5224\u65ad\u70b9\u662f\u5426\u5728\u77e9\u5f62\u5185\"\"\"\n            br = self.bottom_right()\n            return (self.top_left.x &lt;= point.x &lt;= br.x and \n                    self.top_left.y &lt;= point.y &lt;= br.y)\n\n    print(\"\u51e0\u4f55\u56fe\u5f62\u7cfb\u7edf\u793a\u4f8b\uff1a\")\n\n    # \u521b\u5efa\u70b9\n    p1 = Point(0, 0)\n    p2 = Point(3, 4)\n    print(f\"\u70b9: {p1}, {p2}\")\n    print(f\"\u4e24\u70b9\u8ddd\u79bb: {p1.distance_to(p2):.2f}\")\n\n    # \u521b\u5efa\u7ebf\u6bb5\n    line = Line(p1, p2)\n    print(f\"\\n\u7ebf\u6bb5: {line}\")\n    print(f\"\u7ebf\u6bb5\u957f\u5ea6: {line.length():.2f}\")\n    print(f\"\u7ebf\u6bb5\u4e2d\u70b9: {line.midpoint()}\")\n\n    # \u521b\u5efa\u5706\n    circle = Circle(Point(0, 0), 5)\n    print(f\"\\n\u5706: {circle}\")\n    print(f\"\u5706\u9762\u79ef: {circle.area():.2f}\")\n    print(f\"\u5706\u5468\u957f: {circle.circumference():.2f}\")\n    print(f\"\u70b9{Point(3, 4)}\u5728\u5706\u5185: {circle.contains(Point(3, 4))}\")\n    print(f\"\u70b9{Point(6, 0)}\u5728\u5706\u5185: {circle.contains(Point(6, 0))}\")\n\n    # \u521b\u5efa\u77e9\u5f62\n    rect = Rectangle(Point(0, 0), 10, 5)\n    print(f\"\\n\u77e9\u5f62: {rect}\")\n    print(f\"\u77e9\u5f62\u9762\u79ef: {rect.area():.2f}\")\n    print(f\"\u77e9\u5f62\u5468\u957f: {rect.perimeter():.2f}\")\n    print(f\"\u77e9\u5f62\u53f3\u4e0b\u89d2: {rect.bottom_right()}\")\n    print(f\"\u70b9{Point(5, 2)}\u5728\u77e9\u5f62\u5185: {rect.contains(Point(5, 2))}\")\n    print(f\"\u70b9{Point(11, 2)}\u5728\u77e9\u5f62\u5185: {rect.contains(Point(11, 2))}\")\n\n# \u8fd0\u884c\u6f14\u793a\ndemonstrate_python_structs()<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u7b2c\u4e8c\u90e8\u5206\uff1a\u7ec4\u5408\u6570\u636e\u7684\u9ad8\u7ea7\u6a21\u5f0f<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">2.1 \u6570\u636e\u7684\u5d4c\u5957\u4e0e\u7ec4\u5408<\/h3>\n\n\n\n<p>\u73b0\u5b9e\u4e16\u754c\u4e2d\u7684\u6570\u636e\u5f80\u5f80\u662f\u5c42\u6b21\u5316\u7684\uff0c\u6211\u4eec\u9700\u8981\u901a\u8fc7\u5d4c\u5957\u548c\u7ec4\u5408\u6765\u6784\u5efa\u590d\u6742\u7684\u6570\u636e\u7ed3\u6784\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># ============================================================================\n# \u6570\u636e\u7684\u5d4c\u5957\u4e0e\u7ec4\u5408\n# ============================================================================\n\nprint(\"\\n=== \u6570\u636e\u7684\u5d4c\u5957\u4e0e\u7ec4\u5408 ===\")\n\ndef demonstrate_data_composition():\n    \"\"\"\u6f14\u793a\u6570\u636e\u7684\u5d4c\u5957\u4e0e\u7ec4\u5408\"\"\"\n\n    from dataclasses import dataclass, field, asdict\n    from typing import List, Dict, Optional, Set, Tuple\n    import json\n    from datetime import datetime\n\n    # 1. \u57fa\u672c\u5d4c\u5957\uff1a\u5730\u5740\u7cfb\u7edf\n    print(\"1. \u57fa\u672c\u5d4c\u5957\uff1a\u5730\u5740\u7cfb\u7edf\")\n\n    @dataclass\n    class Address:\n        \"\"\"\u5730\u5740\"\"\"\n        street: str\n        city: str\n        state: str\n        zip_code: str\n        country: str = \"USA\"  # \u9ed8\u8ba4\u503c\n\n        def formatted(self) -&gt; str:\n            \"\"\"\u683c\u5f0f\u5316\u5730\u5740\"\"\"\n            return f\"{self.street}\\n{self.city}, {self.state} {self.zip_code}\\n{self.country}\"\n\n    @dataclass\n    class Person:\n        \"\"\"\u4eba\u5458\"\"\"\n        name: str\n        age: int\n        address: Address  # \u5d4c\u5957Address\u5bf9\u8c61\n        email: str\n        phone: str = \"\"  # \u53ef\u9009\u5b57\u6bb5\n\n        def contact_info(self) -&gt; str:\n            \"\"\"\u8054\u7cfb\u4fe1\u606f\"\"\"\n            info = f\"\u59d3\u540d: {self.name}\\n\"\n            info += f\"\u90ae\u7bb1: {self.email}\\n\"\n            if self.phone:\n                info += f\"\u7535\u8bdd: {self.phone}\\n\"\n            info += f\"\u5730\u5740:\\n{self.address.formatted()}\"\n            return info\n\n    print(\"\u57fa\u672c\u5d4c\u5957\u793a\u4f8b\uff1a\")\n    address = Address(\n        street=\"123 Main St\",\n        city=\"New York\",\n        state=\"NY\",\n        zip_code=\"10001\"\n    )\n\n    person = Person(\n        name=\"Alice Smith\",\n        age=30,\n        address=address,\n        email=\"alice@example.com\",\n        phone=\"+1-555-1234\"\n    )\n\n    print(person.contact_info())\n    print(f\"\\nJSON\u8868\u793a:\\n{json.dumps(asdict(person), indent=2, default=str)}\")\n\n    # 2. \u5217\u8868\u5d4c\u5957\uff1a\u8ba2\u5355\u7cfb\u7edf\n    print(\"\\n2. \u5217\u8868\u5d4c\u5957\uff1a\u8ba2\u5355\u7cfb\u7edf\")\n\n    @dataclass\n    class Product:\n        \"\"\"\u4ea7\u54c1\"\"\"\n        id: int\n        name: str\n        price: float\n        description: str = \"\"\n        category: str = \"general\"\n\n        def display_price(self) -&gt; str:\n            \"\"\"\u663e\u793a\u4ef7\u683c\"\"\"\n            return f\"${self.price:.2f}\"\n\n    @dataclass\n    class OrderItem:\n        \"\"\"\u8ba2\u5355\u9879\"\"\"\n        product: Product\n        quantity: int\n\n        def total_price(self) -&gt; float:\n            \"\"\"\u5355\u9879\u603b\u4ef7\"\"\"\n            return self.product.price * self.quantity\n\n        def __str__(self) -&gt; str:\n            return f\"{self.product.name} x{self.quantity}: ${self.total_price():.2f}\"\n\n    @dataclass\n    class Order:\n        \"\"\"\u8ba2\u5355\"\"\"\n        order_id: str\n        customer: Person\n        items: List&#91;OrderItem]  # OrderItem\u5217\u8868\n        order_date: datetime = field(default_factory=datetime.now)\n        status: str = \"pending\"\n\n        def total_amount(self) -&gt; float:\n            \"\"\"\u8ba2\u5355\u603b\u91d1\u989d\"\"\"\n            return sum(item.total_price() for item in self.items)\n\n        def item_count(self) -&gt; int:\n            \"\"\"\u5546\u54c1\u603b\u6570\"\"\"\n            return sum(item.quantity for item in self.items)\n\n        def add_item(self, product: Product, quantity: int = 1):\n            \"\"\"\u6dfb\u52a0\u5546\u54c1\"\"\"\n            self.items.append(OrderItem(product, quantity))\n\n        def __str__(self) -&gt; str:\n            lines = &#91;\n                f\"\u8ba2\u5355\u53f7: {self.order_id}\",\n                f\"\u5ba2\u6237: {self.customer.name}\",\n                f\"\u65e5\u671f: {self.order_date.strftime('%Y-%m-%d %H:%M')}\",\n                f\"\u72b6\u6001: {self.status}\",\n                \"\u5546\u54c1\u6e05\u5355:\",\n            ]\n\n            for i, item in enumerate(self.items, 1):\n                lines.append(f\"  {i}. {item}\")\n\n            lines.append(f\"\u603b\u8ba1: ${self.total_amount():.2f} ({self.item_count()}\u4ef6\u5546\u54c1)\")\n            return \"\\n\".join(lines)\n\n    print(\"\u5217\u8868\u5d4c\u5957\u793a\u4f8b\uff1a\")\n\n    # \u521b\u5efa\u4ea7\u54c1\n    products = &#91;\n        Product(1, \"Laptop\", 999.99, \"\u9ad8\u6027\u80fd\u7b14\u8bb0\u672c\", \"electronics\"),\n        Product(2, \"Mouse\", 29.99, \"\u65e0\u7ebf\u9f20\u6807\", \"electronics\"),\n        Product(3, \"Notebook\", 9.99, \"\u7eb8\u8d28\u7b14\u8bb0\u672c\", \"office\"),\n        Product(4, \"Coffee Mug\", 15.99, \"\u5496\u5561\u676f\", \"kitchen\"),\n    ]\n\n    # \u521b\u5efa\u8ba2\u5355\n    order = Order(\n        order_id=\"ORD-2024-001\",\n        customer=person,\n        items=&#91;\n            OrderItem(products&#91;0], 1),\n            OrderItem(products&#91;1], 2),\n            OrderItem(products&#91;3], 4),\n        ]\n    )\n\n    print(order)\n\n    # \u6dfb\u52a0\u66f4\u591a\u5546\u54c1\n    order.add_item(products&#91;2], 5)\n    print(f\"\\n\u6dfb\u52a0\u5546\u54c1\u540e:\")\n    print(f\"  \u5546\u54c1\u603b\u6570: {order.item_count()}\u4ef6\")\n    print(f\"  \u8ba2\u5355\u603b\u989d: ${order.total_amount():.2f}\")\n\n    # 3. \u5b57\u5178\u5d4c\u5957\uff1a\u5e93\u5b58\u7cfb\u7edf\n    print(\"\\n3. \u5b57\u5178\u5d4c\u5957\uff1a\u5e93\u5b58\u7cfb\u7edf\")\n\n    @dataclass\n    class InventoryItem:\n        \"\"\"\u5e93\u5b58\u9879\"\"\"\n        product: Product\n        quantity: int\n        reorder_point: int = 10  # \u8865\u8d27\u70b9\n        location: str = \"Warehouse A\"\n\n        def needs_reorder(self) -&gt; bool:\n            \"\"\"\u662f\u5426\u9700\u8981\u8865\u8d27\"\"\"\n            return self.quantity &lt;= self.reorder_point\n\n        def value(self) -&gt; float:\n            \"\"\"\u5e93\u5b58\u4ef7\u503c\"\"\"\n            return self.product.price * self.quantity\n\n    @dataclass\n    class Warehouse:\n        \"\"\"\u4ed3\u5e93\"\"\"\n        name: str\n        location: str\n        inventory: Dict&#91;int, InventoryItem] = field(default_factory=dict)  # \u4ea7\u54c1ID\u5230\u5e93\u5b58\u9879\u7684\u6620\u5c04\n\n        def add_product(self, product: Product, quantity: int, location: str = None):\n            \"\"\"\u6dfb\u52a0\u4ea7\u54c1\u5230\u5e93\u5b58\"\"\"\n            if product.id in self.inventory:\n                # \u66f4\u65b0\u73b0\u6709\u5e93\u5b58\n                self.inventory&#91;product.id].quantity += quantity\n            else:\n                # \u521b\u5efa\u65b0\u5e93\u5b58\u9879\n                item_location = location or self.location\n                self.inventory&#91;product.id] = InventoryItem(\n                    product=product,\n                    quantity=quantity,\n                    location=item_location\n                )\n\n        def remove_product(self, product_id: int, quantity: int) -&gt; bool:\n            \"\"\"\u4ece\u5e93\u5b58\u79fb\u9664\u4ea7\u54c1\"\"\"\n            if product_id not in self.inventory:\n                return False\n\n            item = self.inventory&#91;product_id]\n            if item.quantity &lt; quantity:\n                return False\n\n            item.quantity -= quantity\n\n            # \u5982\u679c\u6570\u91cf\u4e3a0\uff0c\u79fb\u9664\u8be5\u9879\n            if item.quantity == 0:\n                del self.inventory&#91;product_id]\n\n            return True\n\n        def total_value(self) -&gt; float:\n            \"\"\"\u4ed3\u5e93\u603b\u4ef7\u503c\"\"\"\n            return sum(item.value() for item in self.inventory.values())\n\n        def products_needing_reorder(self) -&gt; List&#91;InventoryItem]:\n            \"\"\"\u9700\u8981\u8865\u8d27\u7684\u4ea7\u54c1\"\"\"\n            return &#91;item for item in self.inventory.values() if item.needs_reorder()]\n\n        def __str__(self) -&gt; str:\n            lines = &#91;\n                f\"\u4ed3\u5e93: {self.name}\",\n                f\"\u4f4d\u7f6e: {self.location}\",\n                f\"\u5e93\u5b58\u9879\u6570: {len(self.inventory)}\",\n                f\"\u603b\u4ef7\u503c: ${self.total_value():.2f}\",\n            ]\n\n            if self.inventory:\n                lines.append(\"\\n\u5e93\u5b58\u8be6\u60c5:\")\n                for item in self.inventory.values():\n                    status = \"\u26a0\ufe0f \u9700\u8981\u8865\u8d27\" if item.needs_reorder() else \"\u2713 \u5e93\u5b58\u5145\u8db3\"\n                    lines.append(f\"  {item.product.name}: {item.quantity}\u4ef6 (\u4f4d\u7f6e: {item.location}) - {status}\")\n\n            return \"\\n\".join(lines)\n\n    print(\"\u5b57\u5178\u5d4c\u5957\u793a\u4f8b\uff1a\")\n\n    # \u521b\u5efa\u4ed3\u5e93\n    warehouse = Warehouse(\"\u4e3b\u4ed3\u5e93\", \"New York\")\n\n    # \u6dfb\u52a0\u5e93\u5b58\n    for product in products:\n        warehouse.add_product(product, 50 if product.price &gt; 50 else 200)\n\n    # \u6a21\u62df\u9500\u552e\n    warehouse.remove_product(1, 45)  # \u5356\u51fa45\u53f0\u7b14\u8bb0\u672c\n    warehouse.remove_product(2, 195)  # \u5356\u51fa195\u4e2a\u9f20\u6807\n\n    print(warehouse)\n\n    # \u9700\u8981\u8865\u8d27\u7684\u4ea7\u54c1\n    reorder_items = warehouse.products_needing_reorder()\n    print(f\"\\n\u9700\u8981\u8865\u8d27\u7684\u4ea7\u54c1 ({len(reorder_items)}\u79cd):\")\n    for item in reorder_items:\n        print(f\"  {item.product.name}: \u5269\u4f59{item.quantity}\u4ef6\uff0c\u8865\u8d27\u70b9{item.reorder_point}\")\n\n    # 4. \u590d\u6742\u5d4c\u5957\uff1a\u5b66\u6821\u7ba1\u7406\u7cfb\u7edf\n    print(\"\\n4. \u590d\u6742\u5d4c\u5957\uff1a\u5b66\u6821\u7ba1\u7406\u7cfb\u7edf\")\n\n    @dataclass\n    class Grade:\n        \"\"\"\u6210\u7ee9\"\"\"\n        subject: str\n        score: float\n        max_score: float = 100.0\n        weight: float = 1.0\n\n        def percentage(self) -&gt; float:\n            \"\"\"\u767e\u5206\u6bd4\"\"\"\n            return (self.score \/ self.max_score) * 100\n\n        def weighted_score(self) -&gt; float:\n            \"\"\"\u52a0\u6743\u5206\u6570\"\"\"\n            return self.score * self.weight\n\n    @dataclass\n    class Student:\n        \"\"\"\u5b66\u751f\"\"\"\n        id: int\n        name: str\n        age: int\n        grades: Dict&#91;str, List&#91;Grade]] = field(default_factory=dict)  # \u79d1\u76ee\u5230\u6210\u7ee9\u5217\u8868\u7684\u6620\u5c04\n\n        def add_grade(self, grade: Grade):\n            \"\"\"\u6dfb\u52a0\u6210\u7ee9\"\"\"\n            if grade.subject not in self.grades:\n                self.grades&#91;grade.subject] = &#91;]\n            self.grades&#91;grade.subject].append(grade)\n\n        def average_grade(self, subject: str = None) -&gt; Optional&#91;float]:\n            \"\"\"\u5e73\u5747\u6210\u7ee9\"\"\"\n            if subject:\n                # \u7279\u5b9a\u79d1\u76ee\u7684\u5e73\u5747\u6210\u7ee9\n                if subject not in self.grades or not self.grades&#91;subject]:\n                    return None\n                grades = self.grades&#91;subject]\n                total_weighted = sum(g.weighted_score() for g in grades)\n                total_weight = sum(g.weight for g in grades)\n                return total_weighted \/ total_weight if total_weight &gt; 0 else 0.0\n            else:\n                # \u6240\u6709\u79d1\u76ee\u7684\u5e73\u5747\u6210\u7ee9\n                all_grades = &#91;grade for subj_grades in self.grades.values() for grade in subj_grades]\n                if not all_grades:\n                    return None\n                total_weighted = sum(g.weighted_score() for g in all_grades)\n                total_weight = sum(g.weight for g in all_grades)\n                return total_weighted \/ total_weight if total_weight &gt; 0 else 0.0\n\n        def gpa(self, scale: float = 4.0) -&gt; Optional&#91;float]:\n            \"\"\"GPA\uff08\u57fa\u4e8e\u767e\u5206\u5236\uff09\"\"\"\n            avg = self.average_grade()\n            if avg is None:\n                return None\n            # \u7b80\u5355\u8f6c\u6362\uff1a90-100 -&gt; 4.0, 80-89 -&gt; 3.0, \u7b49\u7b49\n            if avg &gt;= 90:\n                return scale\n            elif avg &gt;= 80:\n                return scale * 0.75\n            elif avg &gt;= 70:\n                return scale * 0.5\n            elif avg &gt;= 60:\n                return scale * 0.25\n            else:\n                return 0.0\n\n        def __str__(self) -&gt; str:\n            lines = &#91;\n                f\"\u5b66\u751f: {self.name} (ID: {self.id}, \u5e74\u9f84: {self.age})\",\n            ]\n\n            if self.grades:\n                lines.append(\"\u6210\u7ee9\u5355:\")\n                for subject, grades in self.grades.items():\n                    avg = self.average_grade(subject)\n                    lines.append(f\"  {subject}: {avg:.1f}%\")\n                    for grade in grades:\n                        lines.append(f\"    - {grade.score:.1f}\/{grade.max_score} (\u6743\u91cd: {grade.weight})\")\n\n                overall_avg = self.average_grade()\n                gpa = self.gpa()\n                if overall_avg is not None:\n                    lines.append(f\"\u5e73\u5747\u6210\u7ee9: {overall_avg:.1f}%\")\n                if gpa is not None:\n                    lines.append(f\"GPA: {gpa:.2f}\/{4.0}\")\n            else:\n                lines.append(\"\u6682\u65e0\u6210\u7ee9\")\n\n            return \"\\n\".join(lines)\n\n    @dataclass\n    class Course:\n        \"\"\"\u8bfe\u7a0b\"\"\"\n        code: str\n        name: str\n        instructor: str\n        students: List&#91;Student] = field(default_factory=list)\n        credits: int = 3\n\n        def enroll(self, student: Student):\n            \"\"\"\u6ce8\u518c\u5b66\u751f\"\"\"\n            if student not in self.students:\n                self.students.append(student)\n\n        def average_score(self) -&gt; Optional&#91;float]:\n            \"\"\"\u8bfe\u7a0b\u5e73\u5747\u5206\"\"\"\n            if not self.students:\n                return None\n\n            scores = &#91;]\n            for student in self.students:\n                avg = student.average_grade(self.name)\n                if avg is not None:\n                    scores.append(avg)\n\n            return sum(scores) \/ len(scores) if scores else None\n\n        def __str__(self) -&gt; str:\n            lines = &#91;\n                f\"\u8bfe\u7a0b: {self.code} - {self.name}\",\n                f\"\u6559\u5e08: {self.instructor}\",\n                f\"\u5b66\u5206: {self.credits}\",\n                f\"\u5b66\u751f\u6570: {len(self.students)}\",\n            ]\n\n            avg_score = self.average_score()\n            if avg_score is not None:\n                lines.append(f\"\u8bfe\u7a0b\u5e73\u5747\u5206: {avg_score:.1f}%\")\n\n            if self.students:\n                lines.append(\"\\n\u5b66\u751f\u5217\u8868:\")\n                for student in self.students:\n                    student_avg = student.average_grade(self.name)\n                    status = f\"{student_avg:.1f}%\" if student_avg is not None else \"\u65e0\u6210\u7ee9\"\n                    lines.append(f\"  {student.name}: {status}\")\n\n            return \"\\n\".join(lines)\n\n    print(\"\u590d\u6742\u5d4c\u5957\u793a\u4f8b\uff1a\u5b66\u6821\u7ba1\u7406\u7cfb\u7edf\")\n\n    # \u521b\u5efa\u5b66\u751f\n    alice = Student(1, \"Alice Johnson\", 18)\n    bob = Student(2, \"Bob Smith\", 19)\n    charlie = Student(3, \"Charlie Brown\", 18)\n\n    # \u6dfb\u52a0\u6210\u7ee9\n    alice.add_grade(Grade(\"Math\", 95, weight=1.5))\n    alice.add_grade(Grade(\"Math\", 88))\n    alice.add_grade(Grade(\"Science\", 92))\n    alice.add_grade(Grade(\"History\", 85))\n\n    bob.add_grade(Grade(\"Math\", 78))\n    bob.add_grade(Grade(\"Science\", 91))\n    bob.add_grade(Grade(\"English\", 88))\n\n    charlie.add_grade(Grade(\"Math\", 65))\n    charlie.add_grade(Grade(\"Science\", 72))\n    charlie.add_grade(Grade(\"Art\", 95, weight=0.8))\n\n    print(\"\u5b66\u751f\u4fe1\u606f:\")\n    for student in &#91;alice, bob, charlie]:\n        print(f\"\\n{student}\")\n\n    # \u521b\u5efa\u8bfe\u7a0b\n    math_course = Course(\"MATH101\", \"Calculus I\", \"Dr. Johnson\")\n    science_course = Course(\"SCI101\", \"Physics\", \"Dr. Wilson\")\n\n    # \u6ce8\u518c\u5b66\u751f\n    math_course.enroll(alice)\n    math_course.enroll(bob)\n    math_course.enroll(charlie)\n\n    science_course.enroll(alice)\n    science_course.enroll(bob)\n    science_course.enroll(charlie)\n\n    print(\"\\n\u8bfe\u7a0b\u4fe1\u606f:\")\n    print(f\"\\n{math_course}\")\n    print(f\"\\n{science_course}\")\n\n    # 5. \u6811\u5f62\u7ed3\u6784\uff1a\u7ec4\u7ec7\u7ed3\u6784\u56fe\n    print(\"\\n5. \u6811\u5f62\u7ed3\u6784\uff1a\u7ec4\u7ec7\u7ed3\u6784\u56fe\")\n\n    @dataclass\n    class Employee:\n        \"\"\"\u5458\u5de5\"\"\"\n        id: int\n        name: str\n        position: str\n        salary: float\n        subordinates: List&#91;'Employee'] = field(default_factory=list)  # \u9012\u5f52\u5f15\u7528\n\n        def add_subordinate(self, employee: 'Employee'):\n            \"\"\"\u6dfb\u52a0\u4e0b\u5c5e\"\"\"\n            self.subordinates.append(employee)\n\n        def total_subordinates(self) -&gt; int:\n            \"\"\"\u603b\u4e0b\u5c5e\u6570\uff08\u5305\u62ec\u95f4\u63a5\u4e0b\u5c5e\uff09\"\"\"\n            total = len(self.subordinates)\n            for subordinate in self.subordinates:\n                total += subordinate.total_subordinates()\n            return total\n\n        def department_salary(self) -&gt; float:\n            \"\"\"\u90e8\u95e8\u603b\u85aa\u8d44\"\"\"\n            total = self.salary\n            for subordinate in self.subordinates:\n                total += subordinate.department_salary()\n            return total\n\n        def find_employee(self, employee_id: int) -&gt; Optional&#91;'Employee']:\n            \"\"\"\u67e5\u627e\u5458\u5de5\uff08\u9012\u5f52\u641c\u7d22\uff09\"\"\"\n            if self.id == employee_id:\n                return self\n\n            for subordinate in self.subordinates:\n                found = subordinate.find_employee(employee_id)\n                if found:\n                    return found\n\n            return None\n\n        def print_hierarchy(self, level: int = 0):\n            \"\"\"\u6253\u5370\u7ec4\u7ec7\u5c42\u7ea7\"\"\"\n            indent = \"  \" * level\n            print(f\"{indent}{self.name} ({self.position}) - ${self.salary:,.0f}\")\n\n            for subordinate in self.subordinates:\n                subordinate.print_hierarchy(level + 1)\n\n    # \u521b\u5efa\u7ec4\u7ec7\u5c42\u7ea7\n    ceo = Employee(1, \"Alice CEO\", \"CEO\", 500000)\n    cto = Employee(2, \"Bob CTO\", \"CTO\", 300000)\n    cfo = Employee(3, \"Charlie CFO\", \"CFO\", 280000)\n\n    dev_manager = Employee(4, \"Diana Dev\", \"Development Manager\", 180000)\n    qa_manager = Employee(5, \"Eve QA\", \"QA Manager\", 150000)\n\n    senior_dev = Employee(6, \"Frank Dev\", \"Senior Developer\", 120000)\n    junior_dev = Employee(7, \"Grace Dev\", \"Junior Developer\", 80000)\n    qa_engineer = Employee(8, \"Harry QA\", \"QA Engineer\", 90000)\n\n    # \u6784\u5efa\u5c42\u7ea7\u5173\u7cfb\n    ceo.add_subordinate(cto)\n    ceo.add_subordinate(cfo)\n\n    cto.add_subordinate(dev_manager)\n    cto.add_subordinate(qa_manager)\n\n    dev_manager.add_subordinate(senior_dev)\n    dev_manager.add_subordinate(junior_dev)\n\n    qa_manager.add_subordinate(qa_engineer)\n\n    print(\"\u7ec4\u7ec7\u7ed3\u6784\u56fe:\")\n    ceo.print_hierarchy()\n\n    print(f\"\\n\u7ec4\u7ec7\u7edf\u8ba1:\")\n    print(f\"CEO\u603b\u4e0b\u5c5e\u6570: {ceo.total_subordinates()}\")\n    print(f\"\u90e8\u95e8\u603b\u85aa\u8d44: ${ceo.department_salary():,.0f}\")\n    print(f\"\u5e73\u5747\u85aa\u8d44: ${ceo.department_salary() \/ (ceo.total_subordinates() + 1):,.0f}\")\n\n    # \u67e5\u627e\u5458\u5de5\n    found = ceo.find_employee(6)\n    if found:\n        print(f\"\\n\u67e5\u627e\u5230\u5458\u5de5 ID 6: {found.name}\")\n\n# \u8fd0\u884c\u6f14\u793a\ndemonstrate_data_composition()<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">2.2 \u6570\u636e\u7ec4\u5408\u7684\u8bbe\u8ba1\u6a21\u5f0f<\/h3>\n\n\n\n<p>\u901a\u8fc7\u7ec4\u5408\u6570\u636e\u7ed3\u6784\uff0c\u6211\u4eec\u53ef\u4ee5\u5b9e\u73b0\u5404\u79cd\u6709\u7528\u7684\u8bbe\u8ba1\u6a21\u5f0f\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># ============================================================================\n# \u6570\u636e\u7ec4\u5408\u7684\u8bbe\u8ba1\u6a21\u5f0f\n# ============================================================================\n\nprint(\"\\n=== \u6570\u636e\u7ec4\u5408\u7684\u8bbe\u8ba1\u6a21\u5f0f ===\")\n\ndef demonstrate_data_patterns():\n    \"\"\"\u6f14\u793a\u6570\u636e\u7ec4\u5408\u7684\u8bbe\u8ba1\u6a21\u5f0f\"\"\"\n\n    from dataclasses import dataclass, field, asdict\n    from typing import List, Dict, Optional, Union, Any\n    from abc import ABC, abstractmethod\n    import json\n\n    # 1. \u7ec4\u5408\u6a21\u5f0f\uff08Composite Pattern\uff09\n    print(\"1. \u7ec4\u5408\u6a21\u5f0f\uff08Composite Pattern\uff09\uff1a\")\n\n    @dataclass\n    class FileSystemComponent(ABC):\n        \"\"\"\u6587\u4ef6\u7cfb\u7edf\u7ec4\u4ef6\u62bd\u8c61\u57fa\u7c7b\"\"\"\n        name: str\n\n        @abstractmethod\n        def size(self) -&gt; int:\n            \"\"\"\u83b7\u53d6\u5927\u5c0f\"\"\"\n            pass\n\n        @abstractmethod\n        def display(self, indent: int = 0) -&gt; str:\n            \"\"\"\u663e\u793a\u7ed3\u6784\"\"\"\n            pass\n\n    @dataclass\n    class File(FileSystemComponent):\n        \"\"\"\u6587\u4ef6\"\"\"\n        content_size: int\n\n        def size(self) -&gt; int:\n            return self.content_size\n\n        def display(self, indent: int = 0) -&gt; str:\n            return \"  \" * indent + f\"\ud83d\udcc4 {self.name} ({self.size()} bytes)\"\n\n    @dataclass\n    class Directory(FileSystemComponent):\n        \"\"\"\u76ee\u5f55\"\"\"\n        children: List&#91;FileSystemComponent] = field(default_factory=list)\n\n        def add(self, component: FileSystemComponent):\n            \"\"\"\u6dfb\u52a0\u5b50\u7ec4\u4ef6\"\"\"\n            self.children.append(component)\n\n        def remove(self, component: FileSystemComponent):\n            \"\"\"\u79fb\u9664\u5b50\u7ec4\u4ef6\"\"\"\n            self.children.remove(component)\n\n        def size(self) -&gt; int:\n            \"\"\"\u76ee\u5f55\u5927\u5c0f\uff08\u6240\u6709\u5b50\u7ec4\u4ef6\u7684\u603b\u548c\uff09\"\"\"\n            return sum(child.size() for child in self.children)\n\n        def display(self, indent: int = 0) -&gt; str:\n            lines = &#91;\"  \" * indent + f\"\ud83d\udcc1 {self.name} ({self.size()} bytes)\"]\n            for child in self.children:\n                lines.append(child.display(indent + 1))\n            return \"\\n\".join(lines)\n\n    print(\"\u7ec4\u5408\u6a21\u5f0f\u793a\u4f8b\uff1a\u6587\u4ef6\u7cfb\u7edf\")\n\n    # \u521b\u5efa\u6587\u4ef6\u7cfb\u7edf\u7ed3\u6784\n    root = Directory(\"root\")\n\n    home = Directory(\"home\")\n    user = Directory(\"user\")\n    documents = Directory(\"documents\")\n    downloads = Directory(\"downloads\")\n\n    # \u521b\u5efa\u6587\u4ef6\n    file1 = File(\"notes.txt\", 1500)\n    file2 = File(\"report.pdf\", 2500000)\n    file3 = File(\"photo.jpg\", 3500000)\n    file4 = File(\"song.mp3\", 8000000)\n\n    # \u6784\u5efa\u5c42\u6b21\u7ed3\u6784\n    root.add(home)\n    home.add(user)\n    user.add(documents)\n    user.add(downloads)\n\n    documents.add(file1)\n    documents.add(file2)\n    downloads.add(file3)\n    downloads.add(file4)\n\n    print(root.display())\n\n    # 2. \u8bbf\u95ee\u8005\u6a21\u5f0f\uff08Visitor Pattern\uff09\n    print(\"\\n2. \u8bbf\u95ee\u8005\u6a21\u5f0f\uff08Visitor Pattern\uff09\uff1a\")\n\n    class ShapeVisitor(ABC):\n        \"\"\"\u5f62\u72b6\u8bbf\u95ee\u8005\u63a5\u53e3\"\"\"\n        @abstractmethod\n        def visit_circle(self, circle: 'Circle'):\n            pass\n\n        @abstractmethod\n        def visit_rectangle(self, rectangle: 'Rectangle'):\n            pass\n\n        @abstractmethod\n        def visit_composite(self, composite: 'CompositeShape'):\n            pass\n\n    @dataclass\n    class Shape(ABC):\n        \"\"\"\u5f62\u72b6\u57fa\u7c7b\"\"\"\n        @abstractmethod\n        def accept(self, visitor: ShapeVisitor):\n            \"\"\"\u63a5\u53d7\u8bbf\u95ee\u8005\"\"\"\n            pass\n\n    @dataclass\n    class Circle(Shape):\n        \"\"\"\u5706\u5f62\"\"\"\n        radius: float\n\n        def accept(self, visitor: ShapeVisitor):\n            visitor.visit_circle(self)\n\n        def area(self) -&gt; float:\n            import math\n            return math.pi * self.radius ** 2\n\n    @dataclass\n    class Rectangle(Shape):\n        \"\"\"\u77e9\u5f62\"\"\"\n        width: float\n        height: float\n\n        def accept(self, visitor: ShapeVisitor):\n            visitor.visit_rectangle(self)\n\n        def area(self) -&gt; float:\n            return self.width * self.height\n\n    @dataclass\n    class CompositeShape(Shape):\n        \"\"\"\u590d\u5408\u5f62\u72b6\"\"\"\n        shapes: List&#91;Shape] = field(default_factory=list)\n\n        def add(self, shape: Shape):\n            self.shapes.append(shape)\n\n        def accept(self, visitor: ShapeVisitor):\n            visitor.visit_composite(self)\n            for shape in self.shapes:\n                shape.accept(visitor)\n\n        def area(self) -&gt; float:\n            return sum(shape.area() for shape in self.shapes)\n\n    # \u5177\u4f53\u8bbf\u95ee\u8005\uff1a\u9762\u79ef\u8ba1\u7b97\u5668\n    class AreaCalculator(ShapeVisitor):\n        \"\"\"\u9762\u79ef\u8ba1\u7b97\u5668\"\"\"\n        def __init__(self):\n            self.total_area = 0.0\n\n        def visit_circle(self, circle: Circle):\n            self.total_area += circle.area()\n\n        def visit_rectangle(self, rectangle: Rectangle):\n            self.total_area += rectangle.area()\n\n        def visit_composite(self, composite: CompositeShape):\n            # \u590d\u5408\u5f62\u72b6\u7684\u9762\u79ef\u4f1a\u5728\u904d\u5386\u5b50\u5f62\u72b6\u65f6\u8ba1\u7b97\n            pass\n\n    # \u5177\u4f53\u8bbf\u95ee\u8005\uff1aJSON\u5bfc\u51fa\u5668\n    class JsonExporter(ShapeVisitor):\n        \"\"\"JSON\u5bfc\u51fa\u5668\"\"\"\n        def __init__(self):\n            self.data = &#91;]\n\n        def visit_circle(self, circle: Circle):\n            self.data.append({\n                \"type\": \"circle\",\n                \"radius\": circle.radius,\n                \"area\": circle.area()\n            })\n\n        def visit_rectangle(self, rectangle: Rectangle):\n            self.data.append({\n                \"type\": \"rectangle\",\n                \"width\": rectangle.width,\n                \"height\": rectangle.height,\n                \"area\": rectangle.area()\n            })\n\n        def visit_composite(self, composite: CompositeShape):\n            # \u590d\u5408\u5f62\u72b6\u672c\u8eab\u4e0d\u6dfb\u52a0\u6570\u636e\uff0c\u53ea\u5305\u542b\u5b50\u5f62\u72b6\n            pass\n\n        def export(self) -&gt; str:\n            return json.dumps(self.data, indent=2)\n\n    print(\"\u8bbf\u95ee\u8005\u6a21\u5f0f\u793a\u4f8b\uff1a\u5f62\u72b6\u5904\u7406\")\n\n    # \u521b\u5efa\u5f62\u72b6\n    circle = Circle(5.0)\n    rectangle1 = Rectangle(4.0, 6.0)\n    rectangle2 = Rectangle(3.0, 7.0)\n\n    composite = CompositeShape()\n    composite.add(circle)\n    composite.add(rectangle1)\n    composite.add(rectangle2)\n\n    # \u4f7f\u7528\u9762\u79ef\u8ba1\u7b97\u5668\n    area_calculator = AreaCalculator()\n    composite.accept(area_calculator)\n    print(f\"\u603b\u9762\u79ef: {area_calculator.total_area:.2f}\")\n\n    # \u4f7f\u7528JSON\u5bfc\u51fa\u5668\n    json_exporter = JsonExporter()\n    composite.accept(json_exporter)\n    print(f\"JSON\u5bfc\u51fa:\\n{json_exporter.export()}\")\n\n    # 3. \u5efa\u9020\u8005\u6a21\u5f0f\uff08Builder Pattern\uff09\n    print(\"\\n3. \u5efa\u9020\u8005\u6a21\u5f0f\uff08Builder Pattern\uff09\uff1a\")\n\n    @dataclass\n    class Computer:\n        \"\"\"\u8ba1\u7b97\u673a\"\"\"\n        cpu: str\n        memory_gb: int\n        storage_gb: int\n        gpu: Optional&#91;str] = None\n        operating_system: Optional&#91;str] = None\n        peripherals: List&#91;str] = field(default_factory=list)\n\n        def __str__(self):\n            parts = &#91;\n                f\"CPU: {self.cpu}\",\n                f\"\u5185\u5b58: {self.memory_gb}GB\",\n                f\"\u5b58\u50a8: {self.storage_gb}GB\",\n            ]\n\n            if self.gpu:\n                parts.append(f\"\u663e\u5361: {self.gpu}\")\n\n            if self.operating_system:\n                parts.append(f\"\u64cd\u4f5c\u7cfb\u7edf: {self.operating_system}\")\n\n            if self.peripherals:\n                parts.append(f\"\u5916\u8bbe: {', '.join(self.peripherals)}\")\n\n            return \"\\n\".join(parts)\n\n    class ComputerBuilder:\n        \"\"\"\u8ba1\u7b97\u673a\u5efa\u9020\u8005\"\"\"\n        def __init__(self):\n            self.cpu = \"Intel Core i5\"\n            self.memory_gb = 8\n            self.storage_gb = 256\n            self.gpu = None\n            self.operating_system = None\n            self.peripherals = &#91;]\n\n        def set_cpu(self, cpu: str) -&gt; 'ComputerBuilder':\n            self.cpu = cpu\n            return self\n\n        def set_memory(self, memory_gb: int) -&gt; 'ComputerBuilder':\n            self.memory_gb = memory_gb\n            return self\n\n        def set_storage(self, storage_gb: int) -&gt; 'ComputerBuilder':\n            self.storage_gb = storage_gb\n            return self\n\n        def set_gpu(self, gpu: str) -&gt; 'ComputerBuilder':\n            self.gpu = gpu\n            return self\n\n        def set_operating_system(self, os: str) -&gt; 'ComputerBuilder':\n            self.operating_system = os\n            return self\n\n        def add_peripheral(self, peripheral: str) -&gt; 'ComputerBuilder':\n            self.peripherals.append(peripheral)\n            return self\n\n        def build(self) -&gt; Computer:\n            return Computer(\n                cpu=self.cpu,\n                memory_gb=self.memory_gb,\n                storage_gb=self.storage_gb,\n                gpu=self.gpu,\n                operating_system=self.operating_system,\n                peripherals=self.peripherals\n            )\n\n    # \u5bfc\u6f14\u7c7b\uff08\u53ef\u9009\uff09\n    class ComputerDirector:\n        \"\"\"\u8ba1\u7b97\u673a\u5bfc\u6f14\"\"\"\n        @staticmethod\n        def build_gaming_pc(builder: ComputerBuilder) -&gt; Computer:\n            return (builder\n                   .set_cpu(\"Intel Core i9\")\n                   .set_memory(32)\n                   .set_storage(2000)\n                   .set_gpu(\"NVIDIA RTX 4090\")\n                   .set_operating_system(\"Windows 11\")\n                   .add_peripheral(\"Gaming Mouse\")\n                   .add_peripheral(\"Mechanical Keyboard\")\n                   .add_peripheral(\"Gaming Monitor\")\n                   .build())\n\n        @staticmethod\n        def build_office_pc(builder: ComputerBuilder) -&gt; Computer:\n            return (builder\n                   .set_cpu(\"Intel Core i5\")\n                   .set_memory(16)\n                   .set_storage(512)\n                   .set_operating_system(\"Windows 10\")\n                   .add_peripheral(\"Basic Mouse\")\n                   .add_peripheral(\"Standard Keyboard\")\n                   .build())\n\n        @staticmethod\n        def build_developer_pc(builder: ComputerBuilder) -&gt; Computer:\n            return (builder\n                   .set_cpu(\"AMD Ryzen 9\")\n                   .set_memory(64)\n                   .set_storage(4000)\n                   .set_gpu(\"NVIDIA RTX 3080\")\n                   .set_operating_system(\"Ubuntu 22.04\")\n                   .add_peripheral(\"Ergonomic Mouse\")\n                   .add_peripheral(\"Ergonomic Keyboard\")\n                   .add_peripheral(\"Dual Monitors\")\n                   .build())\n\n    print(\"\u5efa\u9020\u8005\u6a21\u5f0f\u793a\u4f8b\uff1a\u6784\u5efa\u8ba1\u7b97\u673a\")\n\n    builder = ComputerBuilder()\n    director = ComputerDirector()\n\n    print(\"\u6e38\u620f\u7535\u8111\u914d\u7f6e:\")\n    gaming_pc = director.build_gaming_pc(builder)\n    print(gaming_pc)\n\n    print(\"\\n\u529e\u516c\u7535\u8111\u914d\u7f6e:\")\n    office_pc = director.build_office_pc(ComputerBuilder())  # \u65b0\u7684\u5efa\u9020\u8005\n    print(office_pc)\n\n    print(\"\\n\u5f00\u53d1\u7535\u8111\u914d\u7f6e:\")\n    dev_pc = director.build_developer_pc(ComputerBuilder())  # \u65b0\u7684\u5efa\u9020\u8005\n    print(dev_pc)\n\n    # \u81ea\u5b9a\u4e49\u6784\u5efa\n    print(\"\\n\u81ea\u5b9a\u4e49\u914d\u7f6e:\")\n    custom_pc = (ComputerBuilder()\n                .set_cpu(\"Apple M2\")\n                .set_memory(24)\n                .set_storage(1000)\n                .set_operating_system(\"macOS\")\n                .add_peripheral(\"Magic Mouse\")\n                .add_peripheral(\"Magic Keyboard\")\n                .build())\n    print(custom_pc)\n\n    # 4. \u539f\u578b\u6a21\u5f0f\uff08Prototype Pattern\uff09\n    print(\"\\n4. \u539f\u578b\u6a21\u5f0f\uff08Prototype Pattern\uff09\uff1a\")\n\n    import copy\n\n    @dataclass\n    class DocumentTemplate:\n        \"\"\"\u6587\u6863\u6a21\u677f\uff08\u539f\u578b\uff09\"\"\"\n        title: str\n        author: str\n        content: str\n        styles: Dict&#91;str, Any]\n        metadata: Dict&#91;str, Any]\n\n        def clone(self) -&gt; 'DocumentTemplate':\n            \"\"\"\u6df1\u62f7\u8d1d\u514b\u9686\"\"\"\n            return copy.deepcopy(self)\n\n        def customize(self, **kwargs) -&gt; 'DocumentTemplate':\n            \"\"\"\u5b9a\u5236\u5316\u514b\u9686\"\"\"\n            clone = self.clone()\n            for key, value in kwargs.items():\n                if hasattr(clone, key):\n                    setattr(clone, key, value)\n                else:\n                    clone.metadata&#91;key] = value\n            return clone\n\n        def __str__(self):\n            return (f\"\u6587\u6863: {self.title}\\n\"\n                   f\"\u4f5c\u8005: {self.author}\\n\"\n                   f\"\u5185\u5bb9: {self.content&#91;:50]}...\\n\"\n                   f\"\u6837\u5f0f: {self.styles}\\n\"\n                   f\"\u5143\u6570\u636e: {self.metadata}\")\n\n    print(\"\u539f\u578b\u6a21\u5f0f\u793a\u4f8b\uff1a\u6587\u6863\u6a21\u677f\")\n\n    # \u521b\u5efa\u539f\u578b\n    report_template = DocumentTemplate(\n        title=\"\u6708\u5ea6\u62a5\u544a\",\n        author=\"\u516c\u53f8\u6a21\u677f\",\n        content=\"# \u6708\u5ea6\u62a5\u544a\\n\\n## \u6982\u8ff0\\n\\n...\",\n        styles={\n            \"font\": \"Arial\",\n            \"size\": 12,\n            \"color\": \"#000000\"\n        },\n        metadata={\n            \"department\": \"\u6240\u6709\u90e8\u95e8\",\n            \"confidential\": False,\n            \"version\": \"1.0\"\n        }\n    )\n\n    print(\"\u539f\u59cb\u6a21\u677f:\")\n    print(report_template)\n\n    # \u514b\u9686\u5e76\u5b9a\u5236\n    print(\"\\n\u514b\u9686\u5e76\u5b9a\u5236\u9500\u552e\u90e8\u95e8\u62a5\u544a:\")\n    sales_report = report_template.customize(\n        title=\"\u9500\u552e\u90e8\u6708\u5ea6\u62a5\u544a\",\n        author=\"\u9500\u552e\u603b\u76d1\",\n        metadata={\"department\": \"\u9500\u552e\u90e8\", \"confidential\": True}\n    )\n    print(sales_report)\n\n    print(\"\\n\u514b\u9686\u5e76\u5b9a\u5236\u6280\u672f\u90e8\u95e8\u62a5\u544a:\")\n    tech_report = report_template.customize(\n        title=\"\u6280\u672f\u90e8\u6708\u5ea6\u62a5\u544a\",\n        author=\"\u6280\u672f\u603b\u76d1\",\n        content=\"# \u6280\u672f\u90e8\u6708\u5ea6\u62a5\u544a\\n\\n## \u9879\u76ee\u8fdb\u5c55\\n\\n...\",\n        metadata={\"department\": \"\u6280\u672f\u90e8\", \"version\": \"2.0\"}\n    )\n    print(tech_report)\n\n    # \u9a8c\u8bc1\u662f\u72ec\u7acb\u5bf9\u8c61\n    print(f\"\\n\u9a8c\u8bc1\u72ec\u7acb\u6027:\")\n    print(f\"\u539f\u59cb\u6a21\u677f\u6807\u9898: {report_template.title}\")\n    print(f\"\u9500\u552e\u62a5\u544a\u6807\u9898: {sales_report.title}\")\n    print(f\"\u6280\u672f\u62a5\u544a\u6807\u9898: {tech_report.title}\")\n    print(f\"sales_report is report_template? {sales_report is report_template}\")\n\n    # 5. \u4eab\u5143\u6a21\u5f0f\uff08Flyweight Pattern\uff09\n    print(\"\\n5. \u4eab\u5143\u6a21\u5f0f\uff08Flyweight Pattern\uff09\uff1a\")\n\n    @dataclass\n    class TreeType:\n        \"\"\"\u6811\u7c7b\u578b\uff08\u4eab\u5143\uff09\"\"\"\n        name: str\n        color: str\n        texture: str\n\n        def render(self, x: int, y: int, age: int):\n            \"\"\"\u6e32\u67d3\u6811\"\"\"\n            return f\"\u5728({x}, {y})\u6e32\u67d3{self.name}\u6811\uff0c\u989c\u8272{self.color}\uff0c\u7eb9\u7406{self.texture}\uff0c\u6811\u9f84{age}\u5e74\"\n\n    class TreeTypeFactory:\n        \"\"\"\u6811\u7c7b\u578b\u5de5\u5382\uff08\u7ba1\u7406\u4eab\u5143\uff09\"\"\"\n        _tree_types: Dict&#91;str, TreeType] = {}\n\n        @classmethod\n        def get_tree_type(cls, name: str, color: str, texture: str) -&gt; TreeType:\n            \"\"\"\u83b7\u53d6\u6811\u7c7b\u578b\uff0c\u5982\u679c\u4e0d\u5b58\u5728\u5219\u521b\u5efa\"\"\"\n            key = f\"{name}_{color}_{texture}\"\n\n            if key not in cls._tree_types:\n                print(f\"\u521b\u5efa\u65b0\u7684\u6811\u7c7b\u578b: {name}\")\n                cls._tree_types&#91;key] = TreeType(name, color, texture)\n            else:\n                print(f\"\u590d\u7528\u73b0\u6709\u6811\u7c7b\u578b: {name}\")\n\n            return cls._tree_types&#91;key]\n\n    @dataclass\n    class Tree:\n        \"\"\"\u6811\uff08\u5916\u90e8\u72b6\u6001\uff09\"\"\"\n        x: int\n        y: int\n        age: int\n        tree_type: TreeType  # \u4eab\u5143\u5f15\u7528\n\n        def render(self):\n            \"\"\"\u6e32\u67d3\u6811\"\"\"\n            return self.tree_type.render(self.x, self.y, self.age)\n\n    class Forest:\n        \"\"\"\u68ee\u6797\"\"\"\n        def __init__(self):\n            self.trees: List&#91;Tree] = &#91;]\n\n        def plant_tree(self, x: int, y: int, age: int, name: str, color: str, texture: str):\n            \"\"\"\u79cd\u690d\u6811\"\"\"\n            tree_type = TreeTypeFactory.get_tree_type(name, color, texture)\n            tree = Tree(x, y, age, tree_type)\n            self.trees.append(tree)\n\n        def render(self):\n            \"\"\"\u6e32\u67d3\u6574\u4e2a\u68ee\u6797\"\"\"\n            return &#91;tree.render() for tree in self.trees]\n\n        def count_tree_types(self) -&gt; int:\n            \"\"\"\u7edf\u8ba1\u6811\u7c7b\u578b\u6570\u91cf\"\"\"\n            types = set(tree.tree_type for tree in self.trees)\n            return len(types)\n\n    print(\"\u4eab\u5143\u6a21\u5f0f\u793a\u4f8b\uff1a\u68ee\u6797\u6e32\u67d3\")\n\n    # \u521b\u5efa\u68ee\u6797\n    forest = Forest()\n\n    # \u79cd\u690d\u6811\uff08\u8bb8\u591a\u6811\u5171\u4eab\u5c11\u6570\u7c7b\u578b\uff09\n    print(\"\\n\u79cd\u690d\u6811:\")\n    forest.plant_tree(10, 20, 5, \"Oak\", \"Green\", \"Rough\")\n    forest.plant_tree(30, 40, 10, \"Oak\", \"Green\", \"Rough\")  # \u590d\u7528\n    forest.plant_tree(50, 60, 3, \"Pine\", \"Dark Green\", \"Smooth\")\n    forest.plant_tree(70, 80, 7, \"Oak\", \"Green\", \"Rough\")  # \u590d\u7528\n    forest.plant_tree(90, 100, 15, \"Maple\", \"Red\", \"Smooth\")\n    forest.plant_tree(110, 120, 8, \"Pine\", \"Dark Green\", \"Smooth\")  # \u590d\u7528\n\n    # \u6e32\u67d3\u68ee\u6797\n    print(\"\\n\u6e32\u67d3\u68ee\u6797:\")\n    renderings = forest.render()\n    for i, rendering in enumerate(renderings&#91;:3]):  # \u53ea\u663e\u793a\u524d3\u68f5\n        print(f\"  \u6811{i+1}: {rendering}\")\n\n    print(f\"\\n\u68ee\u6797\u7edf\u8ba1:\")\n    print(f\"  \u603b\u6811\u6570: {len(forest.trees)}\")\n    print(f\"  \u6811\u7c7b\u578b\u6570: {forest.count_tree_types()}\")\n    print(f\"  \u5185\u5b58\u8282\u7701: \u6bcf\u68f5\u6811\u7c7b\u578b\u5bf9\u8c61\u88ab{len(forest.trees)\/\/forest.count_tree_types():.1f}\u68f5\u6811\u5171\u4eab\")\n\n    # 6. \u88c5\u9970\u5668\u6a21\u5f0f\uff08\u4f7f\u7528\u6570\u636e\u7c7b\uff09\n    print(\"\\n6. \u88c5\u9970\u5668\u6a21\u5f0f\uff08\u4f7f\u7528\u6570\u636e\u7c7b\uff09\uff1a\")\n\n    @dataclass\n    class Coffee:\n        \"\"\"\u5496\u5561\u57fa\u7c7b\"\"\"\n        description: str = \"\u666e\u901a\u5496\u5561\"\n\n        def cost(self) -&gt; float:\n            return 2.0\n\n        def __str__(self) -&gt; str:\n            return f\"{self.description}: ${self.cost():.2f}\"\n\n    @dataclass\n    class MilkDecorator:\n        \"\"\"\u725b\u5976\u88c5\u9970\u5668\"\"\"\n        coffee: Coffee\n\n        @property\n        def description(self) -&gt; str:\n            return self.coffee.description + \" + \u725b\u5976\"\n\n        def cost(self) -&gt; float:\n            return self.coffee.cost() + 0.5\n\n        def __str__(self) -&gt; str:\n            return f\"{self.description}: ${self.cost():.2f}\"\n\n    @dataclass\n    class SugarDecorator:\n        \"\"\"\u7cd6\u88c5\u9970\u5668\"\"\"\n        coffee: Coffee\n\n        @property\n        def description(self) -&gt; str:\n            return self.coffee.description + \" + \u7cd6\"\n\n        def cost(self) -&gt; float:\n            return self.coffee.cost() + 0.2\n\n        def __str__(self) -&gt; str:\n            return f\"{self.description}: ${self.cost():.2f}\"\n\n    @dataclass\n    class WhippedCreamDecorator:\n        \"\"\"\u5976\u6cb9\u88c5\u9970\u5668\"\"\"\n        coffee: Coffee\n\n        @property\n        def description(self) -&gt; str:\n            return self.coffee.description + \" + \u5976\u6cb9\"\n\n        def cost(self) -&gt; float:\n            return self.coffee.cost() + 0.7\n\n        def __str__(self) -&gt; str:\n            return f\"{self.description}: ${self.cost():.2f}\"\n\n    print(\"\u88c5\u9970\u5668\u6a21\u5f0f\u793a\u4f8b\uff1a\u5496\u5561\u8ba2\u5355\")\n\n    # \u521b\u5efa\u5496\u5561\n    coffee = Coffee()\n    print(f\"\u57fa\u7840\u5496\u5561: {coffee}\")\n\n    # \u6dfb\u52a0\u88c5\u9970\n    coffee_with_milk = MilkDecorator(coffee)\n    print(f\"\u52a0\u725b\u5976: {coffee_with_milk}\")\n\n    coffee_with_milk_and_sugar = SugarDecorator(coffee_with_milk)\n    print(f\"\u52a0\u725b\u5976\u548c\u7cd6: {coffee_with_milk_and_sugar}\")\n\n    fancy_coffee = WhippedCreamDecorator(\n        SugarDecorator(\n            MilkDecorator(coffee)\n        )\n    )\n    print(f\"\u8c6a\u534e\u5496\u5561: {fancy_coffee}\")\n\n# \u8fd0\u884c\u6f14\u793a\ndemonstrate_data_patterns()<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u7b2c\u4e09\u90e8\u5206\uff1a\u51fd\u6570\u5f0f\u7f16\u7a0b\u4e2d\u7684\u6570\u636e\u7ec4\u5408<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">3.1 \u4e0d\u53ef\u53d8\u6570\u636e\u7ed3\u6784<\/h3>\n\n\n\n<p>\u51fd\u6570\u5f0f\u7f16\u7a0b\u5f3a\u8c03\u4e0d\u53ef\u53d8\u6027\uff0c\u8fd9\u5bf9\u4e8e\u5e76\u53d1\u7f16\u7a0b\u548c\u6570\u636e\u4e00\u81f4\u6027\u81f3\u5173\u91cd\u8981\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># ============================================================================\n# \u4e0d\u53ef\u53d8\u6570\u636e\u7ed3\u6784\n# ============================================================================\n\nprint(\"\\n=== \u4e0d\u53ef\u53d8\u6570\u636e\u7ed3\u6784 ===\")\n\ndef demonstrate_immutable_data():\n    \"\"\"\u6f14\u793a\u4e0d\u53ef\u53d8\u6570\u636e\u7ed3\u6784\"\"\"\n\n    import sys\n    from collections import namedtuple\n    from typing import Tuple, List, Dict, FrozenSet\n    import copy\n\n    print(\"\u4e0d\u53ef\u53d8\u6570\u636e\u7ed3\u6784\u7684\u4f18\u52bf\uff1a\")\n    print(\"1. \u7ebf\u7a0b\u5b89\u5168\uff1a\u65e0\u9700\u9501\u5373\u53ef\u5728\u591a\u4e2a\u7ebf\u7a0b\u95f4\u5171\u4eab\")\n    print(\"2. \u53ef\u9884\u6d4b\u6027\uff1a\u72b6\u6001\u4e0d\u4f1a\u610f\u5916\u6539\u53d8\")\n    print(\"3. \u6613\u4e8e\u6d4b\u8bd5\uff1a\u6ca1\u6709\u526f\u4f5c\u7528\")\n    print(\"4. \u6613\u4e8e\u63a8\u7406\uff1a\u503c\u5728\u751f\u547d\u5468\u671f\u5185\u4e0d\u53d8\")\n\n    # 1. Python\u5185\u7f6e\u7684\u4e0d\u53ef\u53d8\u7c7b\u578b\n    print(\"\\n1. Python\u5185\u7f6e\u7684\u4e0d\u53ef\u53d8\u7c7b\u578b\uff1a\")\n\n    # \u57fa\u672c\u4e0d\u53ef\u53d8\u7c7b\u578b\n    immutable_types = &#91;\n        (\"int\", 42),\n        (\"float\", 3.14),\n        (\"str\", \"hello\"),\n        (\"tuple\", (1, 2, 3)),\n        (\"frozenset\", frozenset(&#91;1, 2, 3])),\n        (\"bytes\", b\"data\"),\n    ]\n\n    for type_name, value in immutable_types:\n        print(f\"  {type_name:15}: {value}\")\n\n    # 2. \u4f7f\u7528namedtuple\u521b\u5efa\u4e0d\u53ef\u53d8\u8bb0\u5f55\n    print(\"\\n2. \u4f7f\u7528namedtuple\u521b\u5efa\u4e0d\u53ef\u53d8\u8bb0\u5f55\uff1a\")\n\n    from collections import namedtuple\n\n    # \u521b\u5efa\u4e0d\u53ef\u53d8\u7684\u70b9\n    Point = namedtuple('Point', &#91;'x', 'y'])\n    p1 = Point(10, 20)\n\n    print(f\"\u539f\u59cb\u70b9: {p1}\")\n    print(f\"\u8bbf\u95ee\u5b57\u6bb5: x={p1.x}, y={p1.y}\")\n    print(f\"\u7d22\u5f15\u8bbf\u95ee: p1&#91;0]={p1&#91;0]}, p1&#91;1]={p1&#91;1]}\")\n    print(f\"\u89e3\u5305: x, y = p1 -&gt; x={p1.x}, y={p1.y}\")\n\n    # \u5c1d\u8bd5\u4fee\u6539\uff08\u5e94\u8be5\u5931\u8d25\uff09\n    try:\n        p1.x = 30  # \u5e94\u8be5\u5f15\u53d1AttributeError\n    except AttributeError as e:\n        print(f\"\u4fee\u6539\u5931\u8d25\uff08\u9884\u671f\u4e2d\uff09: {e}\")\n\n    # \u521b\u5efa\u65b0\u5bf9\u8c61\uff08\u51fd\u6570\u5f0f\u66f4\u65b0\uff09\n    p2 = p1._replace(x=30)\n    print(f\"\u521b\u5efa\u65b0\u70b9: {p2}\")\n    print(f\"p1\u4fdd\u6301\u4e0d\u53d8: {p1}\")\n    print(f\"p1 is p2? {p1 is p2}\")\n\n    # 3. \u4e0d\u53ef\u53d8\u5217\u8868\uff08\u4f7f\u7528\u5143\u7ec4\uff09\n    print(\"\\n3. \u4e0d\u53ef\u53d8\u5217\u8868\uff08\u4f7f\u7528\u5143\u7ec4\uff09\uff1a\")\n\n    def immutable_append(lst: Tuple, item) -&gt; Tuple:\n        \"\"\"\u4e0d\u53ef\u53d8\u8ffd\u52a0\"\"\"\n        return lst + (item,)\n\n    def immutable_extend(lst: Tuple, items: Tuple) -&gt; Tuple:\n        \"\"\"\u4e0d\u53ef\u53d8\u6269\u5c55\"\"\"\n        return lst + items\n\n    def immutable_insert(lst: Tuple, index: int, item) -&gt; Tuple:\n        \"\"\"\u4e0d\u53ef\u53d8\u63d2\u5165\"\"\"\n        return lst&#91;:index] + (item,) + lst&#91;index:]\n\n    def immutable_remove(lst: Tuple, index: int) -&gt; Tuple:\n        \"\"\"\u4e0d\u53ef\u53d8\u5220\u9664\"\"\"\n        return lst&#91;:index] + lst&#91;index+1:]\n\n    # \u521d\u59cb\u5217\u8868\n    numbers = (1, 2, 3)\n    print(f\"\u521d\u59cb\u5217\u8868: {numbers}\")\n\n    # \u51fd\u6570\u5f0f\u66f4\u65b0\n    numbers2 = immutable_append(numbers, 4)\n    print(f\"\u8ffd\u52a0\u540e: {numbers2}\")\n\n    numbers3 = immutable_insert(numbers2, 1, 99)\n    print(f\"\u63d2\u5165\u540e: {numbers3}\")\n\n    numbers4 = immutable_remove(numbers3, 2)\n    print(f\"\u5220\u9664\u540e: {numbers4}\")\n\n    print(f\"\u6240\u6709\u7248\u672c\u5171\u5b58: {numbers}, {numbers2}, {numbers3}, {numbers4}\")\n\n    # 4. \u4e0d\u53ef\u53d8\u5b57\u5178\uff08Python 3.3+ \u7684types.MappingProxyType\uff09\n    print(\"\\n4. \u4e0d\u53ef\u53d8\u5b57\u5178\uff1a\")\n\n    from types import MappingProxyType\n\n    # \u521b\u5efa\u53ef\u53d8\u5b57\u5178\n    mutable_dict = {'a': 1, 'b': 2, 'c': 3}\n\n    # \u521b\u5efa\u4e0d\u53ef\u53d8\u89c6\u56fe\n    immutable_dict = MappingProxyType(mutable_dict)\n\n    print(f\"\u539f\u59cb\u5b57\u5178: {mutable_dict}\")\n    print(f\"\u4e0d\u53ef\u53d8\u89c6\u56fe: {immutable_dict}\")\n    print(f\"\u8bbf\u95ee\u5143\u7d20: immutable_dict&#91;'a'] = {immutable_dict&#91;'a']}\")\n\n    # \u5c1d\u8bd5\u4fee\u6539\u4e0d\u53ef\u53d8\u89c6\u56fe\uff08\u5e94\u8be5\u5931\u8d25\uff09\n    try:\n        immutable_dict&#91;'d'] = 4\n    except TypeError as e:\n        print(f\"\u4fee\u6539\u4e0d\u53ef\u53d8\u89c6\u56fe\u5931\u8d25\uff08\u9884\u671f\u4e2d\uff09: {e}\")\n\n    # \u4fee\u6539\u539f\u59cb\u5b57\u5178\uff08\u4e0d\u53ef\u53d8\u89c6\u56fe\u4f1a\u53cd\u6620\u53d8\u5316\uff09\n    mutable_dict&#91;'d'] = 4\n    print(f\"\u4fee\u6539\u539f\u59cb\u5b57\u5178\u540e\uff0c\u4e0d\u53ef\u53d8\u89c6\u56fe: {immutable_dict}\")\n\n    # 5. \u4e0d\u53ef\u53d8\u6811\u7ed3\u6784\n    print(\"\\n5. \u4e0d\u53ef\u53d8\u6811\u7ed3\u6784\uff1a\")\n\n    class ImmutableTree:\n        \"\"\"\u4e0d\u53ef\u53d8\u6811\"\"\"\n\n        __slots__ = ('value', 'left', 'right')  # \u4e0d\u53ef\u53d8\uff0c\u4e0d\u9700\u8981__dict__\n\n        def __init__(self, value, left=None, right=None):\n            self.value = value\n            self.left = left\n            self.right = right\n\n        def __repr__(self):\n            left_repr = f\" {self.left}\" if self.left else \"\"\n            right_repr = f\" {self.right}\" if self.right else \"\"\n            return f\"({self.value}{left_repr}{right_repr})\"\n\n        def insert(self, new_value):\n            \"\"\"\u63d2\u5165\u65b0\u503c\uff0c\u8fd4\u56de\u65b0\u6811\"\"\"\n            if new_value &lt; self.value:\n                new_left = self.left.insert(new_value) if self.left else ImmutableTree(new_value)\n                return ImmutableTree(self.value, new_left, self.right)\n            elif new_value &gt; self.value:\n                new_right = self.right.insert(new_value) if self.right else ImmutableTree(new_value)\n                return ImmutableTree(self.value, self.left, new_right)\n            else:\n                # \u503c\u5df2\u5b58\u5728\uff0c\u8fd4\u56de\u539f\u6811\n                return self\n\n        def contains(self, value):\n            \"\"\"\u68c0\u67e5\u662f\u5426\u5305\u542b\u503c\"\"\"\n            if value == self.value:\n                return True\n            elif value &lt; self.value and self.left:\n                return self.left.contains(value)\n            elif value &gt; self.value and self.right:\n                return self.right.contains(value)\n            return False\n\n        def traverse(self):\n            \"\"\"\u4e2d\u5e8f\u904d\u5386\"\"\"\n            result = &#91;]\n            if self.left:\n                result.extend(self.left.traverse())\n            result.append(self.value)\n            if self.right:\n                result.extend(self.right.traverse())\n            return result\n\n    print(\"\u4e0d\u53ef\u53d8\u4e8c\u53c9\u6811\u793a\u4f8b\uff1a\")\n\n    # \u521b\u5efa\u6811\n    tree1 = ImmutableTree(5)\n    print(f\"\u521d\u59cb\u6811: {tree1}\")\n    print(f\"\u904d\u5386: {tree1.traverse()}\")\n\n    # \u63d2\u5165\u503c\uff08\u521b\u5efa\u65b0\u6811\uff09\n    tree2 = tree1.insert(3)\n    print(f\"\u63d2\u51653\u540e: {tree2}\")\n    print(f\"\u904d\u5386: {tree2.traverse()}\")\n\n    tree3 = tree2.insert(7)\n    print(f\"\u63d2\u51657\u540e: {tree3}\")\n    print(f\"\u904d\u5386: {tree3.traverse()}\")\n\n    tree4 = tree3.insert(1).insert(4).insert(6).insert(8)\n    print(f\"\u63d2\u5165\u66f4\u591a\u503c\u540e: {tree4}\")\n    print(f\"\u904d\u5386: {tree4.traverse()}\")\n\n    print(f\"\\n\u6240\u6709\u7248\u672c\u5171\u5b58:\")\n    print(f\"  tree1: {tree1.traverse()}\")\n    print(f\"  tree2: {tree2.traverse()}\")\n    print(f\"  tree3: {tree3.traverse()}\")\n    print(f\"  tree4: {tree4.traverse()}\")\n\n    # \u9a8c\u8bc1\u4e0d\u53ef\u53d8\u6027\n    print(f\"\\n\u9a8c\u8bc1\u4e0d\u53ef\u53d8\u6027:\")\n    print(f\"  tree1 is tree2? {tree1 is tree2}\")\n    print(f\"  \u539f\u59cb\u6811\u4ecd\u7136\u5b8c\u6574: {tree1.traverse()}\")\n\n    # 6. \u6301\u4e45\u5316\u6570\u636e\u7ed3\u6784\uff08Persistent Data Structures\uff09\n    print(\"\\n6. \u6301\u4e45\u5316\u6570\u636e\u7ed3\u6784\uff1a\")\n\n    class PersistentList:\n        \"\"\"\u6301\u4e45\u5316\u5217\u8868\uff08\u4f7f\u7528\u4e8c\u53c9\u6811\u5b9e\u73b0\uff09\"\"\"\n\n        class Node:\n            \"\"\"\u5185\u90e8\u8282\u70b9\u7c7b\"\"\"\n            __slots__ = ('size', 'value', 'left', 'right')\n\n            def __init__(self, size, value, left=None, right=None):\n                self.size = size  # \u5b50\u6811\u5927\u5c0f\n                self.value = value\n                self.left = left\n                self.right = right\n\n        def __init__(self, root=None):\n            self.root = root\n\n        @classmethod\n        def _create_node(cls, value, left=None, right=None):\n            \"\"\"\u521b\u5efa\u8282\u70b9\"\"\"\n            left_size = left.size if left else 0\n            right_size = right.size if right else 0\n            size = left_size + right_size + 1\n            return cls.Node(size, value, left, right)\n\n        def prepend(self, value):\n            \"\"\"\u5728\u524d\u9762\u6dfb\u52a0\u5143\u7d20\uff0c\u8fd4\u56de\u65b0\u5217\u8868\"\"\"\n            return PersistentList(self._prepend(value, self.root))\n\n        def _prepend(self, value, node):\n            \"\"\"\u9012\u5f52\u5728\u524d\u9762\u6dfb\u52a0\u5143\u7d20\"\"\"\n            if not node:\n                return self._create_node(value)\n\n            # \u5e73\u8861\u63d2\u5165\n            if not node.left:\n                return self._create_node(value, None, node)\n\n            new_left = self._prepend(value, node.left)\n            return self._create_node(node.value, new_left, node.right)\n\n        def get(self, index):\n            \"\"\"\u83b7\u53d6\u5143\u7d20\"\"\"\n            if index &lt; 0 or index &gt;= len(self):\n                raise IndexError(\"\u7d22\u5f15\u8d8a\u754c\")\n            return self._get(index, self.root)\n\n        def _get(self, index, node):\n            \"\"\"\u9012\u5f52\u83b7\u53d6\u5143\u7d20\"\"\"\n            left_size = node.left.size if node.left else 0\n\n            if index &lt; left_size:\n                return self._get(index, node.left)\n            elif index == left_size:\n                return node.value\n            else:\n                return self._get(index - left_size - 1, node.right)\n\n        def __len__(self):\n            return self.root.size if self.root else 0\n\n        def __iter__(self):\n            \"\"\"\u8fed\u4ee3\u5668\"\"\"\n            def traverse(node):\n                if node:\n                    yield from traverse(node.left)\n                    yield node.value\n                    yield from traverse(node.right)\n            return traverse(self.root)\n\n        def __repr__(self):\n            return f\"PersistentList({list(self)})\"\n\n    print(\"\u6301\u4e45\u5316\u5217\u8868\u793a\u4f8b\uff1a\")\n\n    # \u521b\u5efa\u7a7a\u5217\u8868\n    plist1 = PersistentList()\n    print(f\"\u7a7a\u5217\u8868: {plist1}, \u957f\u5ea6: {len(plist1)}\")\n\n    # \u6dfb\u52a0\u5143\u7d20\uff08\u6bcf\u6b21\u8fd4\u56de\u65b0\u5217\u8868\uff09\n    plist2 = plist1.prepend(3)\n    print(f\"\u6dfb\u52a03\u540e: {plist2}, \u957f\u5ea6: {len(plist2)}\")\n\n    plist3 = plist2.prepend(2)\n    print(f\"\u6dfb\u52a02\u540e: {plist3}, \u957f\u5ea6: {len(plist3)}\")\n\n    plist4 = plist3.prepend(1)\n    print(f\"\u6dfb\u52a01\u540e: {plist4}, \u957f\u5ea6: {len(plist4)}\")\n\n    # \u8bbf\u95ee\u5143\u7d20\n    print(f\"\\n\u8bbf\u95ee\u5143\u7d20:\")\n    for i in range(len(plist4)):\n        print(f\"  plist4&#91;{i}] = {plist4.get(i)}\")\n\n    # \u9a8c\u8bc1\u6301\u4e45\u6027\n    print(f\"\\n\u9a8c\u8bc1\u6301\u4e45\u6027:\")\n    print(f\"  plist1: {list(plist1)}\")\n    print(f\"  plist2: {list(plist2)}\")\n    print(f\"  plist3: {list(plist3)}\")\n    print(f\"  plist4: {list(plist4)}\")\n    print(f\"  \u6240\u6709\u7248\u672c\u90fd\u662f\u72ec\u7acb\u5bf9\u8c61\")\n\n    # 7. \u4e0d\u53ef\u53d8\u6027\u4e0e\u5e76\u53d1\n    print(\"\\n7. \u4e0d\u53ef\u53d8\u6027\u4e0e\u5e76\u53d1\uff1a\")\n\n    import threading\n    import time\n\n    class BankAccount:\n        \"\"\"\u4e0d\u53ef\u53d8\u94f6\u884c\u8d26\u6237\"\"\"\n\n        def __init__(self, balance: float = 0.0, history: Tuple = ()):\n            self.balance = balance\n            self.history = history  # \u4ea4\u6613\u5386\u53f2\n\n        def deposit(self, amount: float) -&gt; 'BankAccount':\n            \"\"\"\u5b58\u6b3e\uff0c\u8fd4\u56de\u65b0\u8d26\u6237\"\"\"\n            new_balance = self.balance + amount\n            new_history = self.history + (f\"\u5b58\u6b3e: +{amount:.2f}\",)\n            return BankAccount(new_balance, new_history)\n\n        def withdraw(self, amount: float) -&gt; 'BankAccount':\n            \"\"\"\u53d6\u6b3e\uff0c\u8fd4\u56de\u65b0\u8d26\u6237\"\"\"\n            if amount &gt; self.balance:\n                raise ValueError(\"\u4f59\u989d\u4e0d\u8db3\")\n            new_balance = self.balance - amount\n            new_history = self.history + (f\"\u53d6\u6b3e: -{amount:.2f}\",)\n            return BankAccount(new_balance, new_history)\n\n        def __repr__(self):\n            history_str = \"\\n  \".join(self.history&#91;-5:])  # \u53ea\u663e\u793a\u6700\u8fd15\u6761\n            return f\"\u4f59\u989d: ${self.balance:.2f}\\n\u6700\u8fd1\u4ea4\u6613:\\n  {history_str}\"\n\n    def concurrent_transactions(account, thread_id):\n        \"\"\"\u5e76\u53d1\u4ea4\u6613\"\"\"\n        import random\n\n        for i in range(3):\n            amount = random.uniform(10, 100)\n            if random.choice(&#91;True, False]):\n                new_account = account.deposit(amount)\n                print(f\"\u7ebf\u7a0b{thread_id}: \u5b58\u6b3e${amount:.2f}, \u65b0\u4f59\u989d${new_account.balance:.2f}\")\n            else:\n                try:\n                    new_account = account.withdraw(amount)\n                    print(f\"\u7ebf\u7a0b{thread_id}: \u53d6\u6b3e${amount:.2f}, \u65b0\u4f59\u989d${new_account.balance:.2f}\")\n                except ValueError as e:\n                    print(f\"\u7ebf\u7a0b{thread_id}: \u53d6\u6b3e\u5931\u8d25 - {e}\")\n\n            account = new_account\n            time.sleep(random.uniform(0.1, 0.3))\n\n        return account\n\n    print(\"\u4e0d\u53ef\u53d8\u8d26\u6237\u7684\u5e76\u53d1\u4ea4\u6613\uff1a\")\n\n    # \u521d\u59cb\u8d26\u6237\n    account = BankAccount(1000.0)\n    print(f\"\u521d\u59cb\u8d26\u6237:\\n{account}\")\n\n    # \u6a21\u62df\u5e76\u53d1\u4ea4\u6613\uff08\u6ce8\u610f\uff1a\u7531\u4e8eGIL\uff0cPython\u7ebf\u7a0b\u4e0d\u662f\u771f\u6b63\u7684\u5e76\u884c\uff09\n    print(\"\\n\u5f00\u59cb\u5e76\u53d1\u4ea4\u6613:\")\n    threads = &#91;]\n    results = &#91;]\n\n    for i in range(3):\n        t = threading.Thread(\n            target=lambda i=i: results.append(concurrent_transactions(account, i))\n        )\n        threads.append(t)\n        t.start()\n\n    for t in threads:\n        t.join()\n\n    print(f\"\\n\u4ea4\u6613\u5b8c\u6210\uff0c\u6bcf\u4e2a\u7ebf\u7a0b\u6709\u81ea\u5df1\u7684\u8d26\u6237\u7248\u672c:\")\n    for i, result in enumerate(results):\n        print(f\"\u7ebf\u7a0b{i}\u7684\u6700\u7ec8\u8d26\u6237:\")\n        print(result)\n        print()\n\n    print(f\"\u539f\u59cb\u8d26\u6237\u4fdd\u6301\u4e0d\u53d8:\\n{account}\")\n\n# \u8fd0\u884c\u6f14\u793a\ndemonstrate_immutable_data()<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">3.2 \u4ee3\u6570\u6570\u636e\u7c7b\u578b\uff08ADT\uff09\u4e0e\u6a21\u5f0f\u5339\u914d<\/h3>\n\n\n\n<p>\u4ee3\u6570\u6570\u636e\u7c7b\u578b\u662f\u51fd\u6570\u5f0f\u7f16\u7a0b\u4e2d\u5f3a\u5927\u7684\u6570\u636e\u5efa\u6a21\u5de5\u5177\uff0c\u914d\u5408\u6a21\u5f0f\u5339\u914d\u53ef\u4ee5\u7f16\u5199\u975e\u5e38\u4f18\u96c5\u7684\u4ee3\u7801\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># ============================================================================\n# \u4ee3\u6570\u6570\u636e\u7c7b\u578b\uff08ADT\uff09\u4e0e\u6a21\u5f0f\u5339\u914d\n# ============================================================================\n\nprint(\"\\n=== \u4ee3\u6570\u6570\u636e\u7c7b\u578b\uff08ADT\uff09\u4e0e\u6a21\u5f0f\u5339\u914d ===\")\n\ndef demonstrate_adt_and_pattern_matching():\n    \"\"\"\u6f14\u793a\u4ee3\u6570\u6570\u636e\u7c7b\u578b\u4e0e\u6a21\u5f0f\u5339\u914d\"\"\"\n\n    from typing import Union, Optional, List\n    from enum import Enum\n    from dataclasses import dataclass\n    import json\n\n    print(\"\u4ee3\u6570\u6570\u636e\u7c7b\u578b\uff08Algebraic Data Types\uff09\u7684\u6838\u5fc3\u6982\u5ff5\uff1a\")\n    print(\"1. \u4e58\u79ef\u7c7b\u578b\uff08Product Types\uff09\uff1a\u7c7b\u4f3c\u7ed3\u6784\u4f53\uff0c\u5305\u542b\u591a\u4e2a\u5b57\u6bb5\")\n    print(\"2. \u548c\u7c7b\u578b\uff08Sum Types\uff09\uff1a\u7c7b\u4f3c\u679a\u4e3e\uff0c\u4f46\u6bcf\u4e2a\u53d8\u4f53\u53ef\u4ee5\u643a\u5e26\u6570\u636e\")\n    print(\"3. \u9012\u5f52\u7c7b\u578b\uff1a\u7c7b\u578b\u53ef\u4ee5\u5305\u542b\u81ea\u8eab\")\n\n    # 1. \u4f7f\u7528Python\u5b9e\u73b0ADT\n    print(\"\\n1. \u4f7f\u7528Python\u5b9e\u73b0ADT\uff1a\")\n\n    # \u548c\u7c7b\u578b\uff1a\u4f7f\u7528Union\u548cdataclass\n    @dataclass(frozen=True)\n    class Success:\n        \"\"\"\u6210\u529f\u7ed3\u679c\"\"\"\n        value: any\n\n        def __str__(self):\n            return f\"Success({self.value})\"\n\n    @dataclass(frozen=True)\n    class Failure:\n        \"\"\"\u5931\u8d25\u7ed3\u679c\"\"\"\n        error: str\n\n        def __str__(self):\n            return f\"Failure({self.error})\"\n\n    # \u7ed3\u679c\u7c7b\u578b\u662fSuccess\u6216Failure\n    Result = Union&#91;Success, Failure]\n\n    def process_result(result: Result) -&gt; str:\n        \"\"\"\u5904\u7406\u7ed3\u679c\uff08\u6a21\u5f0f\u5339\u914d\u7684\u7b80\u5355\u5b9e\u73b0\uff09\"\"\"\n        if isinstance(result, Success):\n            return f\"\u5904\u7406\u6210\u529f: {result.value}\"\n        elif isinstance(result, Failure):\n            return f\"\u5904\u7406\u5931\u8d25: {result.error}\"\n        else:\n            raise TypeError(f\"\u672a\u77e5\u7ed3\u679c\u7c7b\u578b: {type(result)}\")\n\n    print(\"\u7b80\u5355ADT\u793a\u4f8b - \u7ed3\u679c\u7c7b\u578b\uff1a\")\n    results = &#91;Success(42), Failure(\"\u6587\u4ef6\u672a\u627e\u5230\"), Success(\"\u5b8c\u6210\")]\n\n    for result in results:\n        print(f\"  {result} -&gt; {process_result(result)}\")\n\n    # 2. \u66f4\u590d\u6742\u7684ADT\uff1a\u8868\u8fbe\u5f0f\u6811\n    print(\"\\n2. \u590d\u6742\u7684ADT\uff1a\u8868\u8fbe\u5f0f\u6811\")\n\n    @dataclass(frozen=True)\n    class Number:\n        \"\"\"\u6570\u5b57\"\"\"\n        value: float\n\n        def __str__(self):\n            return str(self.value)\n\n    @dataclass(frozen=True)\n    class Variable:\n        \"\"\"\u53d8\u91cf\"\"\"\n        name: str\n\n        def __str__(self):\n            return self.name\n\n    @dataclass(frozen=True)\n    class Add:\n        \"\"\"\u52a0\u6cd5\"\"\"\n        left: 'Expr'\n        right: 'Expr'\n\n        def __str__(self):\n            return f\"({self.left} + {self.right})\"\n\n    @dataclass(frozen=True)\n    class Multiply:\n        \"\"\"\u4e58\u6cd5\"\"\"\n        left: 'Expr'\n        right: 'Expr'\n\n        def __str__(self):\n            return f\"({self.left} * {self.right})\"\n\n    @dataclass(frozen=True)\n    class Power:\n        \"\"\"\u5e42\"\"\"\n        base: 'Expr'\n        exponent: 'Expr'\n\n        def __str__(self):\n            return f\"({self.base}^{self.exponent})\"\n\n    # \u8868\u8fbe\u5f0f\u7c7b\u578b\n    Expr = Union&#91;Number, Variable, Add, Multiply, Power]\n\n    def evaluate(expr: Expr, env: dict = None) -&gt; float:\n        \"\"\"\u6c42\u503c\u8868\u8fbe\u5f0f\"\"\"\n        env = env or {}\n\n        # \u6a21\u5f0f\u5339\u914d\u6c42\u503c\n        if isinstance(expr, Number):\n            return expr.value\n        elif isinstance(expr, Variable):\n            return env.get(expr.name, 0.0)\n        elif isinstance(expr, Add):\n            return evaluate(expr.left, env) + evaluate(expr.right, env)\n        elif isinstance(expr, Multiply):\n            return evaluate(expr.left, env) * evaluate(expr.right, env)\n        elif isinstance(expr, Power):\n            return evaluate(expr.base, env) ** evaluate(expr.exponent, env)\n        else:\n            raise TypeError(f\"\u672a\u77e5\u8868\u8fbe\u5f0f\u7c7b\u578b: {type(expr)}\")\n\n    def derivative(expr: Expr, var: str) -&gt; Expr:\n        \"\"\"\u5bf9\u53d8\u91cf\u6c42\u5bfc\"\"\"\n        # \u6a21\u5f0f\u5339\u914d\u6c42\u5bfc\u89c4\u5219\n        if isinstance(expr, Number):\n            return Number(0)  # \u5e38\u6570\u7684\u5bfc\u6570\u4e3a0\n\n        elif isinstance(expr, Variable):\n            if expr.name == var:\n                return Number(1)  # dx\/dx = 1\n            else:\n                return Number(0)  # dy\/dx = 0\n\n        elif isinstance(expr, Add):\n            # d(u+v)\/dx = du\/dx + dv\/dx\n            return Add(\n                derivative(expr.left, var),\n                derivative(expr.right, var)\n            )\n\n        elif isinstance(expr, Multiply):\n            # d(u*v)\/dx = u*dv\/dx + v*du\/dx\n            return Add(\n                Multiply(expr.left, derivative(expr.right, var)),\n                Multiply(expr.right, derivative(expr.left, var))\n            )\n\n        elif isinstance(expr, Power):\n            # \u7b80\u5316\uff1a\u5047\u8bbe\u6307\u6570\u662f\u5e38\u6570\n            if isinstance(expr.exponent, Number):\n                # d(x^n)\/dx = n*x^(n-1)\n                return Multiply(\n                    Number(expr.exponent.value),\n                    Power(\n                        expr.base,\n                        Number(expr.exponent.value - 1)\n                    )\n                )\n            else:\n                # \u590d\u6742\u60c5\u51b5\uff1a\u8fd4\u56de\u5360\u4f4d\u7b26\n                return Variable(\"\u590d\u6742\u5bfc\u6570\")\n\n        else:\n            raise TypeError(f\"\u672a\u77e5\u8868\u8fbe\u5f0f\u7c7b\u578b: {type(expr)}\")\n\n    print(\"\u8868\u8fbe\u5f0f\u6811ADT\u793a\u4f8b\uff1a\")\n\n    # \u6784\u5efa\u8868\u8fbe\u5f0f\uff1af(x) = x^2 + 2*x + 1\n    x = Variable(\"x\")\n    f = Add(\n        Add(\n            Power(x, Number(2)),\n            Multiply(Number(2), x)\n        ),\n        Number(1)\n    )\n\n    print(f\"\u51fd\u6570: f(x) = {f}\")\n\n    # \u6c42\u503c\n    env = {\"x\": 3.0}\n    result = evaluate(f, env)\n    print(f\"f({env&#91;'x']}) = {result}\")\n\n    # \u6c42\u5bfc\n    df_dx = derivative(f, \"x\")\n    print(f\"\u5bfc\u6570: f'(x) = {df_dx}\")\n\n    # \u6c42\u5bfc\u540e\u7684\u503c\n    df_dx_value = evaluate(df_dx, env)\n    print(f\"f'({env&#91;'x']}) = {df_dx_value}\")\n\n    # 3. \u4f7f\u7528match\u8bed\u53e5\uff08Python 3.10+\uff09\n    print(\"\\n3. \u4f7f\u7528match\u8bed\u53e5\uff08Python 3.10+\uff09\uff1a\")\n\n    # \u5f62\u72b6ADT\n    @dataclass(frozen=True)\n    class Circle:\n        \"\"\"\u5706\u5f62\"\"\"\n        radius: float\n\n    @dataclass(frozen=True)\n    class Rectangle:\n        \"\"\"\u77e9\u5f62\"\"\"\n        width: float\n        height: float\n\n    @dataclass(frozen=True)\n    class Triangle:\n        \"\"\"\u4e09\u89d2\u5f62\"\"\"\n        a: float\n        b: float\n        c: float\n\n    Shape = Union&#91;Circle, Rectangle, Triangle]\n\n    def process_shape(shape: Shape) -&gt; str:\n        \"\"\"\u5904\u7406\u5f62\u72b6\uff08\u4f7f\u7528match\u8bed\u53e5\uff09\"\"\"\n        match shape:\n            case Circle(radius=r):\n                import math\n                area = math.pi * r * r\n                return f\"\u5706\u5f62: \u534a\u5f84={r}, \u9762\u79ef={area:.2f}\"\n\n            case Rectangle(width=w, height=h):\n                area = w * h\n                return f\"\u77e9\u5f62: \u5bbd={w}, \u9ad8={h}, \u9762\u79ef={area:.2f}\"\n\n            case Triangle(a=a, b=b, c=c):\n                # \u4f7f\u7528\u6d77\u4f26\u516c\u5f0f\n                s = (a + b + c) \/ 2\n                area = (s * (s - a) * (s - b) * (s - c)) ** 0.5\n                return f\"\u4e09\u89d2\u5f62: \u8fb9\u957f=({a}, {b}, {c}), \u9762\u79ef={area:.2f}\"\n\n            case _:\n                return \"\u672a\u77e5\u5f62\u72b6\"\n\n    print(\"\u4f7f\u7528match\u8bed\u53e5\u8fdb\u884c\u6a21\u5f0f\u5339\u914d\uff1a\")\n    shapes = &#91;\n        Circle(5.0),\n        Rectangle(4.0, 6.0),\n        Triangle(3.0, 4.0, 5.0),\n    ]\n\n    for shape in shapes:\n        print(f\"  {process_shape(shape)}\")\n\n    # 4. \u9012\u5f52ADT\uff1a\u94fe\u8868\n    print(\"\\n4. \u9012\u5f52ADT\uff1a\u94fe\u8868\")\n\n    from typing import Generic, TypeVar\n\n    T = TypeVar('T')\n\n    @dataclass(frozen=True)\n    class Nil:\n        \"\"\"\u7a7a\u5217\u8868\"\"\"\n        def __str__(self):\n            return \"Nil\"\n\n    @dataclass(frozen=True)\n    class Cons(Generic&#91;T]):\n        \"\"\"\u975e\u7a7a\u5217\u8868\uff08\u5934\u5143\u7d20\u548c\u5c3e\u5217\u8868\uff09\"\"\"\n        head: T\n        tail: 'List&#91;T]'  # \u9012\u5f52\u5f15\u7528\n\n        def __str__(self):\n            return f\"({self.head} : {self.tail})\"\n\n    # \u94fe\u8868\u7c7b\u578b\n    List = Union&#91;Nil, Cons&#91;T]]\n\n    def list_to_python(lst: List) -&gt; list:\n        \"\"\"\u5c06\u51fd\u6570\u5f0f\u94fe\u8868\u8f6c\u6362\u4e3aPython\u5217\u8868\"\"\"\n        result = &#91;]\n        current = lst\n\n        while isinstance(current, Cons):\n            result.append(current.head)\n            current = current.tail\n\n        return result\n\n    def python_to_list(py_list: list) -&gt; List:\n        \"\"\"\u5c06Python\u5217\u8868\u8f6c\u6362\u4e3a\u51fd\u6570\u5f0f\u94fe\u8868\"\"\"\n        lst = Nil()\n        for item in reversed(py_list):\n            lst = Cons(item, lst)\n        return lst\n\n    def map_list(f, lst: List) -&gt; List:\n        \"\"\"\u6620\u5c04\u51fd\u6570\u5230\u94fe\u8868\"\"\"\n        match lst:\n            case Nil():\n                return Nil()\n            case Cons(head=head, tail=tail):\n                return Cons(f(head), map_list(f, tail))\n            case _:\n                raise TypeError(\"\u4e0d\u662f\u6709\u6548\u7684\u94fe\u8868\")\n\n    def filter_list(predicate, lst: List) -&gt; List:\n        \"\"\"\u8fc7\u6ee4\u94fe\u8868\"\"\"\n        match lst:\n            case Nil():\n                return Nil()\n            case Cons(head=head, tail=tail):\n                if predicate(head):\n                    return Cons(head, filter_list(predicate, tail))\n                else:\n                    return filter_list(predicate, tail)\n            case _:\n                raise TypeError(\"\u4e0d\u662f\u6709\u6548\u7684\u94fe\u8868\")\n\n    def fold_list(f, acc, lst: List):\n        \"\"\"\u6298\u53e0\u94fe\u8868\"\"\"\n        match lst:\n            case Nil():\n                return acc\n            case Cons(head=head, tail=tail):\n                return fold_list(f, f(acc, head), tail)\n            case _:\n                raise TypeError(\"\u4e0d\u662f\u6709\u6548\u7684\u94fe\u8868\")\n\n    print(\"\u51fd\u6570\u5f0f\u94fe\u8868ADT\u793a\u4f8b\uff1a\")\n\n    # \u521b\u5efa\u94fe\u8868\n    lst = Cons(1, Cons(2, Cons(3, Cons(4, Cons(5, Nil())))))\n    print(f\"\u539f\u59cb\u94fe\u8868: {lst}\")\n    print(f\"Python\u5217\u8868: {list_to_python(lst)}\")\n\n    # \u6620\u5c04\n    doubled = map_list(lambda x: x * 2, lst)\n    print(f\"\u52a0\u500d\u540e: {doubled}\")\n\n    # \u8fc7\u6ee4\n    evens = filter_list(lambda x: x % 2 == 0, lst)\n    print(f\"\u5076\u6570: {evens}\")\n\n    # \u6298\u53e0\uff08\u6c42\u548c\uff09\n    total = fold_list(lambda acc, x: acc + x, 0, lst)\n    print(f\"\u603b\u548c: {total}\")\n\n    # 5. \u4f7f\u7528\u5355\u4f8b\u6a21\u5f0f\u5b9e\u73b0\u66f4\u5b89\u5168\u7684ADT\n    print(\"\\n5. \u4f7f\u7528\u5355\u4f8b\u6a21\u5f0f\u5b9e\u73b0\u66f4\u5b89\u5168\u7684ADT\uff1a\")\n\n    class Option(Generic&#91;T]):\n        \"\"\"Option\u7c7b\u578b\uff08\u7c7b\u4f3cHaskell\u7684Maybe\uff09\"\"\"\n\n        @staticmethod\n        def some(value: T) -&gt; 'Some&#91;T]':\n            return Some(value)\n\n        @staticmethod\n        def none() -&gt; 'None_&#91;T]':\n            return None_()\n\n    @dataclass(frozen=True)\n    class Some(Generic&#91;T]):\n        \"\"\"\u6709\u503c\"\"\"\n        value: T\n\n        def __str__(self):\n            return f\"Some({self.value})\"\n\n        def map(self, f) -&gt; 'Option':\n            \"\"\"\u6620\u5c04\"\"\"\n            return Some(f(self.value))\n\n        def flat_map(self, f) -&gt; 'Option':\n            \"\"\"\u6241\u5e73\u6620\u5c04\"\"\"\n            return f(self.value)\n\n        def get_or_else(self, default):\n            \"\"\"\u83b7\u53d6\u503c\u6216\u9ed8\u8ba4\u503c\"\"\"\n            return self.value\n\n    @dataclass(frozen=True)\n    class None_(Generic&#91;T]):\n        \"\"\"\u65e0\u503c\"\"\"\n\n        def __str__(self):\n            return \"None\"\n\n        def map(self, f) -&gt; 'Option':\n            \"\"\"\u6620\u5c04\uff08\u65e0\u503c\u65f6\u4e0d\u6267\u884c\uff09\"\"\"\n            return self\n\n        def flat_map(self, f) -&gt; 'Option':\n            \"\"\"\u6241\u5e73\u6620\u5c04\"\"\"\n            return self\n\n        def get_or_else(self, default):\n            \"\"\"\u83b7\u53d6\u9ed8\u8ba4\u503c\"\"\"\n            return default\n\n    # \u4f7f\u7528Option\u5904\u7406\u53ef\u80fd\u7f3a\u5931\u7684\u503c\n    def safe_divide(numerator: float, denominator: float) -&gt; Option&#91;float]:\n        \"\"\"\u5b89\u5168\u9664\u6cd5\"\"\"\n        if denominator == 0:\n            return Option.none()\n        else:\n            return Option.some(numerator \/ denominator)\n\n    def safe_sqrt(x: float) -&gt; Option&#91;float]:\n        \"\"\"\u5b89\u5168\u5e73\u65b9\u6839\"\"\"\n        if x &lt; 0:\n            return Option.none()\n        else:\n            return Option.some(x ** 0.5)\n\n    print(\"Option\u7c7b\u578b\u793a\u4f8b\uff1a\")\n\n    # \u94fe\u5f0f\u64cd\u4f5c\n    result1 = (Option.some(16)\n              .flat_map(lambda x: safe_sqrt(x))\n              .flat_map(lambda x: safe_divide(1, x)))\n\n    result2 = (Option.some(-4)\n              .flat_map(safe_sqrt)\n              .flat_map(lambda x: safe_divide(1, x)))\n\n    result3 = (Option.some(0)\n              .flat_map(lambda x: safe_divide(1, x))\n              .flat_map(safe_sqrt))\n\n    results = &#91;result1, result2, result3]\n    for i, result in enumerate(results, 1):\n        print(f\"\u8ba1\u7b97{i}: {result}, \u503c: {result.get_or_else('\u65e0\u7ed3\u679c')}\")\n\n    # 6. \u4f7f\u7528\u679a\u4e3e\u5b9e\u73b0ADT\n    print(\"\\n6. \u4f7f\u7528\u679a\u4e3e\u5b9e\u73b0ADT\uff1a\")\n\n    from enum import Enum\n\n    class JsonValue:\n        \"\"\"JSON\u503cADT\"\"\"\n        pass\n\n    class JsonNull(JsonValue):\n        \"\"\"JSON null\"\"\"\n        def __str__(self):\n            return \"null\"\n\n    class JsonBool(JsonValue):\n        \"\"\"JSON\u5e03\u5c14\u503c\"\"\"\n        def __init__(self, value: bool):\n            self.value = value\n\n        def __str__(self):\n            return \"true\" if self.value else \"false\"\n\n    class JsonNumber(JsonValue):\n        \"\"\"JSON\u6570\u5b57\"\"\"\n        def __init__(self, value: float):\n            self.value = value\n\n        def __str__(self):\n            return str(self.value)\n\n    class JsonString(JsonValue):\n        \"\"\"JSON\u5b57\u7b26\u4e32\"\"\"\n        def __init__(self, value: str):\n            self.value = value\n\n        def __str__(self):\n            return json.dumps(self.value)\n\n    class JsonArray(JsonValue):\n        \"\"\"JSON\u6570\u7ec4\"\"\"\n        def __init__(self, values: List&#91;JsonValue]):\n            self.values = values\n\n        def __str__(self):\n            items = &#91;str(v) for v in self.values]\n            return \"&#91;\" + \", \".join(items) + \"]\"\n\n    class JsonObject(JsonValue):\n        \"\"\"JSON\u5bf9\u8c61\"\"\"\n        def __init__(self, fields: dict):\n            self.fields = fields\n\n        def __str__(self):\n            items = &#91;f\"{json.dumps(k)}: {str(v)}\" for k, v in self.fields.items()]\n            return \"{\" + \", \".join(items) + \"}\"\n\n    def json_stringify(value: JsonValue) -&gt; str:\n        \"\"\"JSON\u5b57\u7b26\u4e32\u5316\uff08\u4f7f\u7528\u6a21\u5f0f\u5339\u914d\uff09\"\"\"\n        match value:\n            case JsonNull():\n                return \"null\"\n            case JsonBool(b):\n                return \"true\" if b else \"false\"\n            case JsonNumber(n):\n                return str(n)\n            case JsonString(s):\n                return json.dumps(s)\n            case JsonArray(arr):\n                items = &#91;json_stringify(item) for item in arr.values]\n                return \"&#91;\" + \", \".join(items) + \"]\"\n            case JsonObject(obj):\n                items = &#91;f\"{json.dumps(k)}: {json_stringify(v)}\" for k, v in obj.fields.items()]\n                return \"{\" + \", \".join(items) + \"}\"\n            case _:\n                raise TypeError(f\"\u672a\u77e5JSON\u7c7b\u578b: {type(value)}\")\n\n    print(\"JSON ADT\u793a\u4f8b\uff1a\")\n\n    # \u6784\u5efa\u590d\u6742\u7684JSON\u503c\n    json_data = JsonObject({\n        \"name\": JsonString(\"Alice\"),\n        \"age\": JsonNumber(30),\n        \"active\": JsonBool(True),\n        \"scores\": JsonArray(&#91;\n            JsonNumber(95.5),\n            JsonNumber(88.0),\n            JsonNumber(92.5)\n        ]),\n        \"address\": JsonObject({\n            \"street\": JsonString(\"123 Main St\"),\n            \"city\": JsonString(\"New York\"),\n            \"zip\": JsonNumber(10001)\n        }),\n        \"tags\": JsonArray(&#91;\n            JsonString(\"user\"),\n            JsonString(\"premium\"),\n            JsonNull()  # \u7a7a\u6807\u7b7e\n        ])\n    })\n\n    print(\"JSON\u503c:\")\n    print(json_stringify(json_data))\n\n    # \u4e0e\u6807\u51c6\u5e93\u5bf9\u6bd4\n    print(\"\\n\u4e0e\u6807\u51c6\u5e93json.dumps()\u5bf9\u6bd4:\")\n    python_data = {\n        \"name\": \"Alice\",\n        \"age\": 30,\n        \"active\": True,\n        \"scores\": &#91;95.5, 88.0, 92.5],\n        \"address\": {\n            \"street\": \"123 Main St\",\n            \"city\": \"New York\",\n            \"zip\": 10001\n        },\n        \"tags\": &#91;\"user\", \"premium\", None]\n    }\n\n    std_json = json.dumps(python_data, indent=2)\n    print(f\"\u6807\u51c6\u5e93:\\n{std_json}\")\n\n# \u8fd0\u884c\u6f14\u793a\ndemonstrate_adt_and_pattern_matching()<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u7b2c\u56db\u90e8\u5206\uff1a\u6570\u636e\u7ec4\u5408\u7684\u6700\u4f73\u5b9e\u8df5\u4e0e\u672a\u6765\u8d8b\u52bf<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">4.1 \u6570\u636e\u5efa\u6a21\u7684\u6700\u4f73\u5b9e\u8df5<\/h3>\n\n\n\n<p>\u826f\u597d\u7684\u6570\u636e\u5efa\u6a21\u662f\u6784\u5efa\u5065\u58ee\u8f6f\u4ef6\u7684\u57fa\u7840\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># ============================================================================\n# \u6570\u636e\u5efa\u6a21\u7684\u6700\u4f73\u5b9e\u8df5\n# ============================================================================\n\nprint(\"\\n=== \u6570\u636e\u5efa\u6a21\u7684\u6700\u4f73\u5b9e\u8df5 ===\")\n\ndef demonstrate_data_modeling_best_practices():\n    \"\"\"\u6f14\u793a\u6570\u636e\u5efa\u6a21\u7684\u6700\u4f73\u5b9e\u8df5\"\"\"\n\n    from dataclasses import dataclass, field, asdict\n    from typing import List, Dict, Optional, Set, Any\n    from enum import Enum\n    import json\n    from datetime import datetime, date\n    import sys\n\n    print(\"\u6570\u636e\u5efa\u6a21\u7684\u5341\u4e2a\u6700\u4f73\u5b9e\u8df5\uff1a\")\n\n    # 1. \u660e\u786e\u9886\u57df\u6a21\u578b\n    print(\"\\n1. \u660e\u786e\u9886\u57df\u6a21\u578b\uff1a\")\n    print(\"   \u7406\u89e3\u4e1a\u52a1\u9886\u57df\uff0c\u521b\u5efa\u53cd\u6620\u73b0\u5b9e\u4e16\u754c\u7684\u6a21\u578b\")\n\n    @dataclass\n    class Money:\n        \"\"\"\u8d27\u5e01\u503c\uff08\u503c\u5bf9\u8c61\uff09\"\"\"\n        amount: float\n        currency: str = \"USD\"\n\n        def __post_init__(self):\n            \"\"\"\u9a8c\u8bc1\"\"\"\n            if self.amount &lt; 0:\n                raise ValueError(\"\u91d1\u989d\u4e0d\u80fd\u4e3a\u8d1f\")\n            if len(self.currency) != 3:\n                raise ValueError(\"\u8d27\u5e01\u4ee3\u7801\u5fc5\u987b\u662f3\u4e2a\u5b57\u7b26\")\n\n        def __add__(self, other: 'Money') -&gt; 'Money':\n            \"\"\"\u52a0\u6cd5\"\"\"\n            if self.currency != other.currency:\n                raise ValueError(\"\u8d27\u5e01\u4e0d\u5339\u914d\")\n            return Money(self.amount + other.amount, self.currency)\n\n        def __mul__(self, multiplier: float) -&gt; 'Money':\n            \"\"\"\u4e58\u6cd5\"\"\"\n            return Money(self.amount * multiplier, self.currency)\n\n        def format(self) -&gt; str:\n            \"\"\"\u683c\u5f0f\u5316\"\"\"\n            return f\"{self.currency} {self.amount:,.2f}\"\n\n    @dataclass\n    class Address:\n        \"\"\"\u5730\u5740\uff08\u503c\u5bf9\u8c61\uff09\"\"\"\n        street: str\n        city: str\n        state: str\n        zip_code: str\n        country: str = \"USA\"\n\n        def __post_init__(self):\n            \"\"\"\u9a8c\u8bc1\"\"\"\n            if not self.zip_code.isdigit() or len(self.zip_code) != 5:\n                raise ValueError(\"\u90ae\u653f\u7f16\u7801\u5fc5\u987b\u662f5\u4f4d\u6570\u5b57\")\n\n    @dataclass\n    class Customer:\n        \"\"\"\u5ba2\u6237\uff08\u5b9e\u4f53\uff09\"\"\"\n        id: str\n        name: str\n        email: str\n        address: Address\n        joined_date: date = field(default_factory=date.today)\n\n        def __post_init__(self):\n            \"\"\"\u9a8c\u8bc1\"\"\"\n            if \"@\" not in self.email:\n                raise ValueError(\"\u65e0\u6548\u7684\u90ae\u7bb1\u5730\u5740\")\n\n    print(\"   \u793a\u4f8b\uff1a\u7535\u5546\u9886\u57df\u6a21\u578b\")\n    print(\"   - Money: \u503c\u5bf9\u8c61\uff0c\u5177\u6709\u9a8c\u8bc1\u548c\u4e1a\u52a1\u903b\u8f91\")\n    print(\"   - Address: \u503c\u5bf9\u8c61\uff0c\u4e0d\u53ef\u53d8\")\n    print(\"   - Customer: \u5b9e\u4f53\uff0c\u5177\u6709\u6807\u8bc6\u7b26\")\n\n    # 2. \u4f7f\u7528\u503c\u5bf9\u8c61\n    print(\"\\n2. \u4f7f\u7528\u503c\u5bf9\u8c61\uff1a\")\n    print(\"   \u5bf9\u4e8e\u6ca1\u6709\u6807\u8bc6\u7b26\u7684\u6982\u5ff5\uff0c\u4f7f\u7528\u503c\u5bf9\u8c61\")\n\n    try:\n        money1 = Money(100.0, \"USD\")\n        money2 = Money(50.0, \"USD\")\n        total = money1 + money2\n        print(f\"   \u503c\u5bf9\u8c61\u793a\u4f8b: {money1.format()} + {money2.format()} = {total.format()}\")\n\n        # \u9a8c\u8bc1\n        try:\n            invalid_money = Money(-100.0)\n        except ValueError as e:\n            print(f\"   \u9a8c\u8bc1\u751f\u6548: {e}\")\n    except Exception as e:\n        print(f\"   \u793a\u4f8b\u9519\u8bef: {e}\")\n\n    # 3. \u4fdd\u6301\u4e0d\u53ef\u53d8\u6027\n    print(\"\\n3. \u4fdd\u6301\u4e0d\u53ef\u53d8\u6027\uff1a\")\n    print(\"   \u5c3d\u53ef\u80fd\u4f7f\u7528\u4e0d\u53ef\u53d8\u6570\u636e\u7ed3\u6784\")\n\n    @dataclass(frozen=True)\n    class ImmutableProduct:\n        \"\"\"\u4e0d\u53ef\u53d8\u4ea7\u54c1\"\"\"\n        id: str\n        name: str\n        price: Money\n\n        def with_discount(self, percent: float) -&gt; 'ImmutableProduct':\n            \"\"\"\u5e94\u7528\u6298\u6263\uff0c\u8fd4\u56de\u65b0\u4ea7\u54c1\"\"\"\n            if not 0 &lt;= percent &lt;= 100:\n                raise ValueError(\"\u6298\u6263\u767e\u5206\u6bd4\u5fc5\u987b\u57280-100\u4e4b\u95f4\")\n\n            discount_factor = 1 - (percent \/ 100)\n            new_price = self.price * discount_factor\n\n            return ImmutableProduct(\n                id=self.id,\n                name=self.name,\n                price=new_price\n            )\n\n    product = ImmutableProduct(\"P001\", \"Laptop\", Money(1000.0))\n    discounted_product = product.with_discount(20)\n\n    print(f\"   \u539f\u59cb\u4ea7\u54c1: {product.name} - {product.price.format()}\")\n    print(f\"   \u6298\u6263\u4ea7\u54c1: {discounted_product.name} - {discounted_product.price.format()}\")\n    print(f\"   \u539f\u59cb\u4ea7\u54c1\u4e0d\u53d8: {product.price.format()}\")\n\n    # 4. \u9886\u57df\u9a71\u52a8\u8bbe\u8ba1\uff08DDD\uff09\u6a21\u5f0f\n    print(\"\\n4. \u9886\u57df\u9a71\u52a8\u8bbe\u8ba1\uff08DDD\uff09\u6a21\u5f0f\uff1a\")\n\n    class OrderStatus(Enum):\n        \"\"\"\u8ba2\u5355\u72b6\u6001\u679a\u4e3e\"\"\"\n        PENDING = \"pending\"\n        CONFIRMED = \"confirmed\"\n        SHIPPED = \"shipped\"\n        DELIVERED = \"delivered\"\n        CANCELLED = \"cancelled\"\n\n    @dataclass\n    class OrderItem:\n        \"\"\"\u8ba2\u5355\u9879\uff08\u503c\u5bf9\u8c61\uff09\"\"\"\n        product_id: str\n        product_name: str\n        quantity: int\n        unit_price: Money\n\n        def total_price(self) -&gt; Money:\n            return self.unit_price * self.quantity\n\n        def __post_init__(self):\n            if self.quantity &lt;= 0:\n                raise ValueError(\"\u6570\u91cf\u5fc5\u987b\u5927\u4e8e0\")\n\n    class Order:\n        \"\"\"\u8ba2\u5355\uff08\u805a\u5408\u6839\uff09\"\"\"\n\n        def __init__(self, order_id: str, customer_id: str):\n            self.order_id = order_id\n            self.customer_id = customer_id\n            self._items: List&#91;OrderItem] = &#91;]\n            self._status: OrderStatus = OrderStatus.PENDING\n            self.created_at: datetime = datetime.now()\n            self.updated_at: datetime = self.created_at\n\n        def add_item(self, item: OrderItem):\n            \"\"\"\u6dfb\u52a0\u8ba2\u5355\u9879\"\"\"\n            if self._status != OrderStatus.PENDING:\n                raise ValueError(\"\u53ea\u80fd\u5411\u5f85\u5904\u7406\u8ba2\u5355\u6dfb\u52a0\u5546\u54c1\")\n\n            self._items.append(item)\n            self.updated_at = datetime.now()\n\n        def remove_item(self, product_id: str):\n            \"\"\"\u79fb\u9664\u8ba2\u5355\u9879\"\"\"\n            if self._status != OrderStatus.PENDING:\n                raise ValueError(\"\u53ea\u80fd\u4ece\u5f85\u5904\u7406\u8ba2\u5355\u79fb\u9664\u5546\u54c1\")\n\n            self._items = &#91;item for item in self._items if item.product_id != product_id]\n            self.updated_at = datetime.now()\n\n        def confirm(self):\n            \"\"\"\u786e\u8ba4\u8ba2\u5355\"\"\"\n            if self._status != OrderStatus.PENDING:\n                raise ValueError(\"\u53ea\u80fd\u786e\u8ba4\u5f85\u5904\u7406\u8ba2\u5355\")\n            if not self._items:\n                raise ValueError(\"\u8ba2\u5355\u4e0d\u80fd\u4e3a\u7a7a\")\n\n            self._status = OrderStatus.CONFIRMED\n            self.updated_at = datetime.now()\n\n        def ship(self):\n            \"\"\"\u53d1\u8d27\"\"\"\n            if self._status != OrderStatus.CONFIRMED:\n                raise ValueError(\"\u53ea\u80fd\u53d1\u8d27\u5df2\u786e\u8ba4\u8ba2\u5355\")\n\n            self._status = OrderStatus.SHIPPED\n            self.updated_at = datetime.now()\n\n        def cancel(self):\n            \"\"\"\u53d6\u6d88\u8ba2\u5355\"\"\"\n            if self._status not in &#91;OrderStatus.PENDING, OrderStatus.CONFIRMED]:\n                raise ValueError(\"\u53ea\u80fd\u53d6\u6d88\u5f85\u5904\u7406\u6216\u5df2\u786e\u8ba4\u8ba2\u5355\")\n\n            self._status = OrderStatus.CANCELLED\n            self.updated_at = datetime.now()\n\n        @property\n        def items(self) -&gt; List&#91;OrderItem]:\n            \"\"\"\u83b7\u53d6\u8ba2\u5355\u9879\uff08\u53ea\u8bfb\uff09\"\"\"\n            return self._items.copy()\n\n        @property\n        def status(self) -&gt; OrderStatus:\n            \"\"\"\u83b7\u53d6\u72b6\u6001\uff08\u53ea\u8bfb\uff09\"\"\"\n            return self._status\n\n        def total_amount(self) -&gt; Money:\n            \"\"\"\u603b\u91d1\u989d\"\"\"\n            if not self._items:\n                return Money(0.0)\n\n            total = Money(0.0)\n            for item in self._items:\n                total = total + item.total_price()\n            return total\n\n        def __str__(self):\n            return (f\"\u8ba2\u5355 {self.order_id}\\n\"\n                   f\"\u72b6\u6001: {self.status.value}\\n\"\n                   f\"\u5ba2\u6237: {self.customer_id}\\n\"\n                   f\"\u5546\u54c1\u6570: {len(self._items)}\\n\"\n                   f\"\u603b\u91d1\u989d: {self.total_amount().format()}\")\n\n    print(\"   DDD\u6a21\u5f0f\u793a\u4f8b\uff1a\u8ba2\u5355\u805a\u5408\")\n    order = Order(\"ORD-001\", \"CUST-001\")\n\n    order.add_item(OrderItem(\"P001\", \"Laptop\", 1, Money(1000.0)))\n    order.add_item(OrderItem(\"P002\", \"Mouse\", 2, Money(25.0)))\n\n    print(f\"\\n   \u521b\u5efa\u8ba2\u5355:\\n{order}\")\n\n    order.confirm()\n    print(f\"\\n   \u786e\u8ba4\u540e:\\n\u72b6\u6001: {order.status.value}\")\n\n    # 5. \u6570\u636e\u9a8c\u8bc1\n    print(\"\\n5. \u6570\u636e\u9a8c\u8bc1\uff1a\")\n    print(\"   \u5728\u6570\u636e\u8fdb\u5165\u7cfb\u7edf\u65f6\u8fdb\u884c\u9a8c\u8bc1\")\n\n    class ValidatedUser:\n        \"\"\"\u5e26\u9a8c\u8bc1\u7684\u7528\u6237\"\"\"\n\n        def __init__(self, username: str, email: str, age: int):\n            self._validate_username(username)\n            self._validate_email(email)\n            self._validate_age(age)\n\n            self.username = username\n            self.email = email\n            self.age = age\n\n        @staticmethod\n        def _validate_username(username: str):\n            if not username:\n                raise ValueError(\"\u7528\u6237\u540d\u4e0d\u80fd\u4e3a\u7a7a\")\n            if len(username) &lt; 3:\n                raise ValueError(\"\u7528\u6237\u540d\u81f3\u5c113\u4e2a\u5b57\u7b26\")\n            if len(username) &gt; 50:\n                raise ValueError(\"\u7528\u6237\u540d\u6700\u591a50\u4e2a\u5b57\u7b26\")\n            if not username.isalnum():\n                raise ValueError(\"\u7528\u6237\u540d\u53ea\u80fd\u5305\u542b\u5b57\u6bcd\u548c\u6570\u5b57\")\n\n        @staticmethod\n        def _validate_email(email: str):\n            if \"@\" not in email:\n                raise ValueError(\"\u65e0\u6548\u7684\u90ae\u7bb1\u5730\u5740\")\n            if not email.split(\"@\")&#91;-1].count(\".\") &gt;= 1:\n                raise ValueError(\"\u65e0\u6548\u7684\u90ae\u7bb1\u57df\u540d\")\n\n        @staticmethod\n        def _validate_age(age: int):\n            if age &lt; 0:\n                raise ValueError(\"\u5e74\u9f84\u4e0d\u80fd\u4e3a\u8d1f\")\n            if age &gt; 150:\n                raise ValueError(\"\u5e74\u9f84\u4e0d\u80fd\u8d85\u8fc7150\")\n\n        def __str__(self):\n            return f\"\u7528\u6237: {self.username}, \u90ae\u7bb1: {self.email}, \u5e74\u9f84: {self.age}\"\n\n    print(\"   \u6570\u636e\u9a8c\u8bc1\u793a\u4f8b\uff1a\")\n    try:\n        user1 = ValidatedUser(\"alice123\", \"alice@example.com\", 30)\n        print(f\"   \u6709\u6548\u7528\u6237: {user1}\")\n\n        user2 = ValidatedUser(\"a\", \"invalid-email\", 200)\n        print(f\"   \u65e0\u6548\u7528\u6237: {user2}\")\n    except ValueError as e:\n        print(f\"   \u9a8c\u8bc1\u5931\u8d25: {e}\")\n\n    # 6. \u5e8f\u5217\u5316\u4e0e\u53cd\u5e8f\u5217\u5316\n    print(\"\\n6. \u5e8f\u5217\u5316\u4e0e\u53cd\u5e8f\u5217\u5316\uff1a\")\n    print(\"   \u4e3a\u6570\u636e\u7c7b\u63d0\u4f9b\u5e8f\u5217\u5316\u65b9\u6cd5\")\n\n    @dataclass\n    class SerializableProduct:\n        \"\"\"\u53ef\u5e8f\u5217\u5316\u4ea7\u54c1\"\"\"\n        id: str\n        name: str\n        price: float\n        category: str\n\n        def to_dict(self) -&gt; dict:\n            \"\"\"\u8f6c\u6362\u4e3a\u5b57\u5178\"\"\"\n            return asdict(self)\n\n        def to_json(self) -&gt; str:\n            \"\"\"\u8f6c\u6362\u4e3aJSON\"\"\"\n            return json.dumps(self.to_dict(), indent=2)\n\n        @classmethod\n        def from_dict(cls, data: dict) -&gt; 'SerializableProduct':\n            \"\"\"\u4ece\u5b57\u5178\u521b\u5efa\"\"\"\n            return cls(**data)\n\n        @classmethod\n        def from_json(cls, json_str: str) -&gt; 'SerializableProduct':\n            \"\"\"\u4eceJSON\u521b\u5efa\"\"\"\n            data = json.loads(json_str)\n            return cls.from_dict(data)\n\n    product = SerializableProduct(\"P001\", \"Laptop\", 999.99, \"Electronics\")\n\n    print(\"   \u5e8f\u5217\u5316\u793a\u4f8b\uff1a\")\n    json_str = product.to_json()\n    print(f\"   JSON: {json_str&#91;:50]}...\")\n\n    product_copy = SerializableProduct.from_json(json_str)\n    print(f\"   \u53cd\u5e8f\u5217\u5316: {product_copy}\")\n\n    # 7. \u6027\u80fd\u8003\u8651\n    print(\"\\n7. \u6027\u80fd\u8003\u8651\uff1a\")\n    print(\"   \u6839\u636e\u4f7f\u7528\u573a\u666f\u9009\u62e9\u6570\u636e\u7ed3\u6784\")\n\n    def test_memory_usage():\n        \"\"\"\u6d4b\u8bd5\u5185\u5b58\u4f7f\u7528\"\"\"\n\n        # \u4f7f\u7528__slots__\u7684\u7c7b\n        class SlottedPoint:\n            __slots__ = ('x', 'y')\n            def __init__(self, x, y):\n                self.x = x\n                self.y = y\n\n        # \u666e\u901a\u7c7b\n        class RegularPoint:\n            def __init__(self, x, y):\n                self.x = x\n                self.y = y\n\n        # \u521b\u5efa\u591a\u4e2a\u5b9e\u4f8b\n        n = 10000\n\n        slotted_points = &#91;SlottedPoint(i, i) for i in range(n)]\n        regular_points = &#91;RegularPoint(i, i) for i in range(n)]\n\n        slotted_size = sys.getsizeof(slotted_points) + sum(sys.getsizeof(p) for p in slotted_points)\n        regular_size = sys.getsizeof(regular_points) + sum(sys.getsizeof(p) for p in regular_points)\n\n        print(f\"   {n}\u4e2a\u70b9\u7684\u5185\u5b58\u4f7f\u7528\uff1a\")\n        print(f\"   \u4f7f\u7528__slots__: {slotted_size:,} \u5b57\u8282\")\n        print(f\"   \u666e\u901a\u7c7b: {regular_size:,} \u5b57\u8282\")\n        print(f\"   \u8282\u7701: {(regular_size - slotted_size) \/ regular_size * 100:.1f}%\")\n\n    test_memory_usage()\n\n    # 8. \u6587\u6863\u5316\u6570\u636e\u7ed3\u6784\n    print(\"\\n8. \u6587\u6863\u5316\u6570\u636e\u7ed3\u6784\uff1a\")\n    print(\"   \u4e3a\u6240\u6709\u6570\u636e\u7ed3\u6784\u63d0\u4f9b\u6e05\u6670\u7684\u6587\u6863\")\n\n    @dataclass\n    class WellDocumented:\n        \"\"\"\n        \u826f\u597d\u6587\u6863\u5316\u7684\u6570\u636e\u7c7b\u793a\u4f8b\u3002\n\n        \u5c5e\u6027\uff1a\n            id (str): \u552f\u4e00\u6807\u8bc6\u7b26\uff0c\u683c\u5f0f\u4e3a\"TYPE-001\"\n            name (str): \u540d\u79f0\uff0c\u957f\u5ea6\u57281-100\u5b57\u7b26\u4e4b\u95f4\n            created_at (datetime): \u521b\u5efa\u65f6\u95f4\u6233\n            tags (List&#91;str]): \u6807\u7b7e\u5217\u8868\uff0c\u7528\u4e8e\u5206\u7c7b\n        \"\"\"\n        id: str\n        name: str\n        created_at: datetime = field(default_factory=datetime.now)\n        tags: List&#91;str] = field(default_factory=list)\n\n        def __post_init__(self):\n            \"\"\"\n            \u521d\u59cb\u5316\u540e\u9a8c\u8bc1\u3002\n\n            \u9a8c\u8bc1\u89c4\u5219\uff1a\n                - id\u4e0d\u80fd\u4e3a\u7a7a\n                - name\u957f\u5ea6\u57281-100\u5b57\u7b26\u4e4b\u95f4\n                - tags\u4e0d\u80fd\u5305\u542b\u7a7a\u5b57\u7b26\u4e32\n            \"\"\"\n            if not self.id:\n                raise ValueError(\"id\u4e0d\u80fd\u4e3a\u7a7a\")\n            if not 1 &lt;= len(self.name) &lt;= 100:\n                raise ValueError(\"name\u957f\u5ea6\u5fc5\u987b\u57281-100\u5b57\u7b26\u4e4b\u95f4\")\n            if any(not tag for tag in self.tags):\n                raise ValueError(\"tags\u4e0d\u80fd\u5305\u542b\u7a7a\u5b57\u7b26\u4e32\")\n\n        def add_tag(self, tag: str):\n            \"\"\"\n            \u6dfb\u52a0\u6807\u7b7e\u3002\n\n            \u53c2\u6570\uff1a\n                tag (str): \u8981\u6dfb\u52a0\u7684\u6807\u7b7e\n\n            \u8fd4\u56de\uff1a\n                \u65e0\n            \"\"\"\n            if not tag:\n                raise ValueError(\"\u6807\u7b7e\u4e0d\u80fd\u4e3a\u7a7a\")\n            if tag not in self.tags:\n                self.tags.append(tag)\n\n    print(\"   \u6587\u6863\u5316\u793a\u4f8b\uff1a\")\n    print(\"   - \u7c7b\u6587\u6863\u5b57\u7b26\u4e32\u63cf\u8ff0\u6574\u4f53\u76ee\u7684\")\n    print(\"   - \u5c5e\u6027\u6587\u6863\u8bf4\u660e\u6bcf\u4e2a\u5b57\u6bb5\")\n    print(\"   - \u65b9\u6cd5\u6587\u6863\u8bf4\u660e\u53c2\u6570\u548c\u8fd4\u56de\u503c\")\n    print(\"   - __post_init__\u7528\u4e8e\u9a8c\u8bc1\")\n\n    # 9. \u6d4b\u8bd5\u6570\u636e\u7c7b\n    print(\"\\n9. \u6d4b\u8bd5\u6570\u636e\u7c7b\uff1a\")\n    print(\"   \u4e3a\u6570\u636e\u7ed3\u6784\u7f16\u5199\u5355\u5143\u6d4b\u8bd5\")\n\n    import unittest\n\n    class TestMoney(unittest.TestCase):\n        \"\"\"Money\u7c7b\u7684\u6d4b\u8bd5\"\"\"\n\n        def test_creation(self):\n            \"\"\"\u6d4b\u8bd5\u521b\u5efa\"\"\"\n            money = Money(100.0, \"USD\")\n            self.assertEqual(money.amount, 100.0)\n            self.assertEqual(money.currency, \"USD\")\n\n        def test_validation(self):\n            \"\"\"\u6d4b\u8bd5\u9a8c\u8bc1\"\"\"\n            with self.assertRaises(ValueError):\n                Money(-100.0)\n\n        def test_addition(self):\n            \"\"\"\u6d4b\u8bd5\u52a0\u6cd5\"\"\"\n            money1 = Money(100.0, \"USD\")\n            money2 = Money(50.0, \"USD\")\n            total = money1 + money2\n            self.assertEqual(total.amount, 150.0)\n\n        def test_currency_mismatch(self):\n            \"\"\"\u6d4b\u8bd5\u8d27\u5e01\u4e0d\u5339\u914d\"\"\"\n            money1 = Money(100.0, \"USD\")\n            money2 = Money(50.0, \"EUR\")\n            with self.assertRaises(ValueError):\n                money1 + money2\n\n    # \u8fd0\u884c\u6d4b\u8bd5\n    print(\"   \u6d4b\u8bd5\u793a\u4f8b\uff08\u7b80\u5316\uff09\uff1a\")\n    suite = unittest.TestLoader().loadTestsFromTestCase(TestMoney)\n    runner = unittest.TextTestRunner(verbosity=0)\n    result = runner.run(suite)\n    print(f\"   \u6d4b\u8bd5\u7ed3\u679c: {result.testsRun}\u4e2a\u6d4b\u8bd5\uff0c{len(result.failures)}\u4e2a\u5931\u8d25\")\n\n    # 10. \u6f14\u8fdb\u548c\u517c\u5bb9\u6027\n    print(\"\\n10. \u6f14\u8fdb\u548c\u517c\u5bb9\u6027\uff1a\")\n    print(\"   \u8bbe\u8ba1\u80fd\u591f\u6f14\u8fdb\u7684\u6570\u636e\u7ed3\u6784\")\n\n    @dataclass\n    class BackwardCompatible:\n        \"\"\"\u5411\u540e\u517c\u5bb9\u7684\u6570\u636e\u7c7b\"\"\"\n        id: str\n        name: str\n        # \u65b0\u5b57\u6bb5\u6709\u9ed8\u8ba4\u503c\uff0c\u786e\u4fdd\u5411\u540e\u517c\u5bb9\n        version: int = 1\n        metadata: Dict&#91;str, Any] = field(default_factory=dict)\n\n        @classmethod\n        def from_legacy_dict(cls, data: dict) -&gt; 'BackwardCompatible':\n            \"\"\"\u4ece\u65e7\u683c\u5f0f\u5b57\u5178\u521b\u5efa\"\"\"\n            # \u5904\u7406\u65e7\u683c\u5f0f\n            if 'user_id' in data:  # \u65e7\u5b57\u6bb5\u540d\n                data&#91;'id'] = data.pop('user_id')\n\n            # \u8bbe\u7f6e\u9ed8\u8ba4\u503c\n            data.setdefault('version', 1)\n            data.setdefault('metadata', {})\n\n            return cls(**data)\n\n    print(\"   \u5411\u540e\u517c\u5bb9\u793a\u4f8b\uff1a\")\n    legacy_data = {\"user_id\": \"123\", \"name\": \"Alice\"}\n    new_obj = BackwardCompatible.from_legacy_dict(legacy_data)\n    print(f\"   \u65e7\u6570\u636e\u8f6c\u6362: {new_obj}\")\n\n    current_data = {\"id\": \"123\", \"name\": \"Alice\", \"version\": 2, \"metadata\": {\"role\": \"admin\"}}\n    current_obj = BackwardCompatible(**current_data)\n    print(f\"   \u5f53\u524d\u6570\u636e: {current_obj}\")\n\n# \u8fd0\u884c\u6f14\u793a\ndemonstrate_data_modeling_best_practices()\n\n# \u6570\u636e\u7ec4\u5408\u7684\u672a\u6765\u8d8b\u52bf\nprint(\"\\n\" + \"=\"*60)\nprint(\"\u6570\u636e\u7ec4\u5408\u7684\u672a\u6765\u8d8b\u52bf\")\nprint(\"=\"*60)\n\nprint(\"\"\"\n1. \u66f4\u5f3a\u5927\u7684\u7c7b\u578b\u7cfb\u7edf\n   \u2022 \u4f9d\u8d56\u7c7b\u578b\uff08Dependent Types\uff09\n   \u2022 \u7ec6\u5316\u7c7b\u578b\uff08Refinement Types\uff09\n   \u2022 \u4f1a\u8bdd\u7c7b\u578b\uff08Session Types\uff09\n\n2. \u96f6\u6210\u672c\u62bd\u8c61\n   \u2022 \u7f16\u8bd1\u65f6\u6570\u636e\u7ed3\u6784\u4f18\u5316\n   \u2022 \u81ea\u52a8\u5185\u5b58\u5e03\u5c40\u4f18\u5316\n   \u2022 \u9759\u6001\u6d88\u9664\u8fd0\u884c\u65f6\u5f00\u9500\n\n3. \u5f62\u5f0f\u9a8c\u8bc1\n   \u2022 \u81ea\u52a8\u8bc1\u660e\u6570\u636e\u7ed3\u6784\u4e0d\u53d8\u6027\n   \u2022 \u8fd0\u884c\u65f6\u884c\u4e3a\u9a8c\u8bc1\n   \u2022 \u5b89\u5168\u4fdd\u8bc1\n\n4. \u9886\u57df\u7279\u5b9a\u8bed\u8a00\uff08DSL\uff09\n   \u2022 \u9488\u5bf9\u7279\u5b9a\u9886\u57df\u7684\u6570\u636e\u5efa\u6a21\u8bed\u8a00\n   \u2022 \u81ea\u52a8\u4ee3\u7801\u751f\u6210\n   \u2022 \u53ef\u89c6\u5316\u6570\u636e\u5efa\u6a21\n\n5. \u4eba\u5de5\u667a\u80fd\u8f85\u52a9\n   \u2022 AI\u81ea\u52a8\u63a8\u8350\u6570\u636e\u7ed3\u6784\n   \u2022 \u6027\u80fd\u4f18\u5316\u5efa\u8bae\n   \u2022 \u91cd\u6784\u5efa\u8bae\n\n6. \u8de8\u8bed\u8a00\u6570\u636e\u4ea4\u6362\n   \u2022 \u7edf\u4e00\u7684\u6570\u636e\u5e8f\u5217\u5316\u683c\u5f0f\n   \u2022 \u81ea\u52a8\u7c7b\u578b\u6620\u5c04\n   \u2022 \u8de8\u5e73\u53f0\u6570\u636e\u5171\u4eab\n\n7. \u5b9e\u65f6\u534f\u4f5c\u6570\u636e\u7ed3\u6784\n   \u2022 \u51b2\u7a81\u81ea\u7531\u590d\u5236\u6570\u636e\u7c7b\u578b\uff08CRDT\uff09\n   \u2022 \u5b9e\u65f6\u534f\u540c\u7f16\u8f91\n   \u2022 \u5206\u5e03\u5f0f\u4e00\u81f4\u6027\n\n8. \u53ef\u9006\u8ba1\u7b97\n   \u2022 \u53ef\u9006\u6570\u636e\u7ed3\u6784\n   \u2022 \u65e0\u526f\u4f5c\u7528\u7684\u66f4\u65b0\n   \u2022 \u65f6\u95f4\u65c5\u884c\u8c03\u8bd5\n\n\u6311\u6218\u4e0e\u673a\u9047\uff1a\n1. \u590d\u6742\u6027\u7ba1\u7406\uff1a\u968f\u7740\u7cfb\u7edf\u589e\u957f\uff0c\u6570\u636e\u6a21\u578b\u53d8\u5f97\u590d\u6742\n2. \u6027\u80fd\u6743\u8861\uff1a\u7c7b\u578b\u5b89\u5168\u4e0e\u8fd0\u884c\u65f6\u6027\u80fd\u7684\u5e73\u8861\n3. \u5b66\u4e60\u66f2\u7ebf\uff1a\u65b0\u7684\u7c7b\u578b\u7cfb\u7edf\u548c\u8303\u5f0f\u9700\u8981\u5b66\u4e60\n4. \u5de5\u5177\u652f\u6301\uff1a\u9700\u8981\u66f4\u597d\u7684IDE\u548c\u5de5\u5177\u94fe\u652f\u6301\n5. \u56e2\u961f\u534f\u4f5c\uff1a\u786e\u4fdd\u56e2\u961f\u6210\u5458\u5bf9\u6570\u636e\u6a21\u578b\u6709\u5171\u540c\u7406\u89e3\n\n\u6700\u4f73\u5b9e\u8df5\u6f14\u8fdb\uff1a\n1. \u6570\u636e\u4f18\u5148\u8bbe\u8ba1\uff1a\u4ece\u6570\u636e\u6a21\u578b\u5f00\u59cb\u8bbe\u8ba1\u7cfb\u7edf\n2. \u5951\u7ea6\u9a71\u52a8\u5f00\u53d1\uff1a\u660e\u786e\u5b9a\u4e49\u6570\u636e\u5951\u7ea6\n3. \u6e10\u8fdb\u7c7b\u578b\uff1a\u4ece\u52a8\u6001\u7c7b\u578b\u9010\u6b65\u8f6c\u5411\u9759\u6001\u7c7b\u578b\n4. \u53ef\u89c6\u5316\u5efa\u6a21\uff1a\u4f7f\u7528\u5de5\u5177\u53ef\u89c6\u5316\u6570\u636e\u7ed3\u6784\n\n\u7ed3\u8bed\uff1a\u6570\u636e\u662f\u8f6f\u4ef6\u7684\u6838\u5fc3\n\u826f\u597d\u7684\u6570\u636e\u5efa\u6a21\u662f\u6784\u5efa\u53ef\u9760\u3001\u53ef\u7ef4\u62a4\u3001\u9ad8\u6027\u80fd\u7cfb\u7edf\u7684\u57fa\u77f3\u3002\n\u968f\u7740\u6280\u672f\u7684\u53d1\u5c55\uff0c\u6211\u4eec\u5c06\u6709\u66f4\u591a\u5de5\u5177\u548c\u65b9\u6cd5\u6765\u8bbe\u8ba1\u548c\u5b9e\u73b0\n\u9ad8\u6548\u7684\u6570\u636e\u7ed3\u6784\uff0c\u4f46\u57fa\u672c\u539f\u5219\u2014\u2014\u6e05\u6670\u3001\u4e00\u81f4\u3001\u53ef\u9a8c\u8bc1\u2014\u2014\n\u5c06\u6c38\u8fdc\u4fdd\u6301\u4e0d\u53d8\u3002\n\"\"\")<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u603b\u7ed3<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">5.1 \u7ed3\u6784\u4f53\u4e0e\u7ec4\u5408\u6570\u636e\u7684\u6838\u5fc3\u6d1e\u89c1<\/h3>\n\n\n\n<p>\u901a\u8fc7\u8fd9\u5802\u8bfe\uff0c\u6211\u4eec\u83b7\u5f97\u4e86\u4ee5\u4e0b\u6838\u5fc3\u6d1e\u89c1\uff1a<\/p>\n\n\n\n<p><strong>\u7ed3\u6784\u4f53\u662f\u6570\u636e\u7684\u903b\u8f91\u5206\u7ec4<\/strong>\uff1a\u5c06\u76f8\u5173\u7684\u6570\u636e\u9879\u7ec4\u5408\u5728\u4e00\u8d77\uff0c\u5f62\u6210\u6709\u610f\u4e49\u7684\u6574\u4f53\u3002<\/p>\n\n\n\n<p><strong>\u7ec4\u5408\u4f18\u4e8e\u7ee7\u627f<\/strong>\uff1a\u901a\u8fc7\u7ec4\u5408\u7b80\u5355\u7ed3\u6784\u6765\u6784\u5efa\u590d\u6742\u7ed3\u6784\uff0c\u800c\u4e0d\u662f\u901a\u8fc7\u7ee7\u627f\u5c42\u6b21\u3002<\/p>\n\n\n\n<p><strong>\u4e0d\u53ef\u53d8\u6027\u5e26\u6765\u5b89\u5168\u6027<\/strong>\uff1a\u4e0d\u53ef\u53d8\u6570\u636e\u7ed3\u6784\u5728\u591a\u7ebf\u7a0b\u73af\u5883\u548c\u51fd\u6570\u5f0f\u7f16\u7a0b\u4e2d\u81f3\u5173\u91cd\u8981\u3002<\/p>\n\n\n\n<p><strong>\u7c7b\u578b\u7cfb\u7edf\u662f\u5f3a\u5927\u7684\u5de5\u5177<\/strong>\uff1a\u9759\u6001\u7c7b\u578b\u68c0\u67e5\u53ef\u4ee5\u5728\u7f16\u8bd1\u65f6\u6355\u83b7\u8bb8\u591a\u9519\u8bef\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">5.2 \u6570\u636e\u5efa\u6a21\u7684\u4f18\u52bf<\/h3>\n\n\n\n<p><strong>\u63d0\u9ad8\u4ee3\u7801\u6e05\u6670\u5ea6<\/strong>\uff1a\u826f\u597d\u7684\u6570\u636e\u6a21\u578b\u4f7f\u4ee3\u7801\u610f\u56fe\u66f4\u660e\u786e\u3002<\/p>\n\n\n\n<p><strong>\u589e\u5f3a\u7c7b\u578b\u5b89\u5168<\/strong>\uff1a\u7f16\u8bd1\u65f6\u7c7b\u578b\u68c0\u67e5\u51cf\u5c11\u8fd0\u884c\u65f6\u9519\u8bef\u3002<\/p>\n\n\n\n<p><strong>\u4fc3\u8fdb\u4ee3\u7801\u590d\u7528<\/strong>\uff1a\u901a\u7528\u6570\u636e\u7ed3\u6784\u53ef\u4ee5\u5728\u591a\u4e2a\u5730\u65b9\u91cd\u7528\u3002<\/p>\n\n\n\n<p><strong>\u7b80\u5316\u5e76\u53d1\u7f16\u7a0b<\/strong>\uff1a\u4e0d\u53ef\u53d8\u6570\u636e\u7ed3\u6784\u65e0\u9700\u9501\u5373\u53ef\u5171\u4eab\u3002<\/p>\n\n\n\n<p><strong>\u652f\u6301\u9886\u57df\u5efa\u6a21<\/strong>\uff1a\u6570\u636e\u6a21\u578b\u53ef\u4ee5\u76f4\u63a5\u53cd\u6620\u4e1a\u52a1\u9886\u57df\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">5.3 \u5b9e\u7528\u5efa\u8bae<\/h3>\n\n\n\n<p><strong>\u4f55\u65f6\u4f7f\u7528\u7ed3\u6784\u4f53\uff1a<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5f53\u9700\u8981\u5c06\u76f8\u5173\u6570\u636e\u7ec4\u5408\u5728\u4e00\u8d77\u65f6<\/li>\n\n\n\n<li>\u5f53\u9700\u8981\u5b9a\u4e49\u6e05\u6670\u7684\u63a5\u53e3\u65f6<\/li>\n\n\n\n<li>\u5f53\u9700\u8981\u7c7b\u578b\u5b89\u5168\u65f6<\/li>\n\n\n\n<li>\u5f53\u9700\u8981\u4f18\u5316\u5185\u5b58\u5e03\u5c40\u65f6<\/li>\n<\/ul>\n\n\n\n<p><strong>\u4f55\u65f6\u4f7f\u7528\u4e0d\u53ef\u53d8\u6570\u636e\u7ed3\u6784\uff1a<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5728\u591a\u7ebf\u7a0b\u73af\u5883\u4e2d<\/li>\n\n\n\n<li>\u5728\u51fd\u6570\u5f0f\u7f16\u7a0b\u4e2d<\/li>\n\n\n\n<li>\u5f53\u9700\u8981\u6570\u636e\u5386\u53f2\u8bb0\u5f55\u65f6<\/li>\n\n\n\n<li>\u5f53\u9700\u8981\u7b80\u5316\u63a8\u7406\u65f6<\/li>\n<\/ul>\n\n\n\n<p><strong>\u6570\u636e\u5efa\u6a21\u539f\u5219\uff1a<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u9886\u57df\u9a71\u52a8\uff1a\u4ece\u4e1a\u52a1\u9886\u57df\u51fa\u53d1\u8bbe\u8ba1\u6570\u636e\u7ed3\u6784<\/li>\n\n\n\n<li>\u5355\u4e00\u804c\u8d23\uff1a\u6bcf\u4e2a\u6570\u636e\u7ed3\u6784\u53ea\u505a\u4e00\u4ef6\u4e8b<\/li>\n\n\n\n<li>\u660e\u786e\u5951\u7ea6\uff1a\u660e\u786e\u5b9a\u4e49\u6570\u636e\u7684\u9a8c\u8bc1\u89c4\u5219<\/li>\n\n\n\n<li>\u6e10\u8fdb\u590d\u6742\uff1a\u4ece\u7b80\u5355\u7ed3\u6784\u5f00\u59cb\uff0c\u9010\u6e10\u589e\u52a0\u590d\u6742\u6027<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">5.4 \u8bed\u8a00\u9009\u62e9\u5efa\u8bae<\/h3>\n\n\n\n<p><strong>Rust<\/strong>\uff1a\u5f3a\u5927\u7684\u7c7b\u578b\u7cfb\u7edf\uff0c\u6240\u6709\u6743\u6a21\u578b\uff0c\u96f6\u6210\u672c\u62bd\u8c61\uff0c\u9002\u5408\u7cfb\u7edf\u7f16\u7a0b\u3002<\/p>\n\n\n\n<p><strong>TypeScript<\/strong>\uff1a\u6e10\u8fdb\u7c7b\u578b\uff0c\u4f18\u79c0\u7684IDE\u652f\u6301\uff0c\u9002\u5408Web\u5f00\u53d1\u3002<\/p>\n\n\n\n<p><strong>Go<\/strong>\uff1a\u7b80\u5355\u76f4\u63a5\u7684\u7ed3\u6784\u4f53\uff0c\u7ec4\u5408\u4f18\u4e8e\u7ee7\u627f\uff0c\u9002\u5408\u7f51\u7edc\u670d\u52a1\u3002<\/p>\n\n\n\n<p><strong>Python<\/strong>\uff1a\u52a8\u6001\u7c7b\u578b\uff0c\u591a\u79cd\u9009\u62e9\uff08dataclass\u3001namedtuple\u3001Pydantic\uff09\uff0c\u9002\u5408\u5feb\u901f\u5f00\u53d1\u3002<\/p>\n\n\n\n<p><strong>Haskell\/OCaml<\/strong>\uff1a\u5f3a\u5927\u7684\u4ee3\u6570\u6570\u636e\u7c7b\u578b\uff0c\u6a21\u5f0f\u5339\u914d\uff0c\u7eaf\u51fd\u6570\u5f0f\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">5.5 \u7ec8\u6781\u76ee\u6807\uff1a\u6570\u636e\u9a71\u52a8\u8bbe\u8ba1<\/h3>\n\n\n\n<p>\u8bb0\u4f4f\uff0c\u6570\u636e\u662f\u8f6f\u4ef6\u7684\u6838\u5fc3\u3002\u826f\u597d\u7684\u6570\u636e\u5efa\u6a21\u4e0d\u4ec5\u5f71\u54cd\u4ee3\u7801\u8d28\u91cf\uff0c\u8fd8\u5f71\u54cd\u7cfb\u7edf\u67b6\u6784\u548c\u56e2\u961f\u534f\u4f5c\uff1a<\/p>\n\n\n\n<p><strong>\u6570\u636e\u4f18\u5148<\/strong>\uff1a\u4ece\u6570\u636e\u6a21\u578b\u5f00\u59cb\u8bbe\u8ba1\uff0c\u800c\u4e0d\u662f\u4ece\u4ee3\u7801\u5f00\u59cb\u3002<\/p>\n\n\n\n<p><strong>\u5951\u7ea6\u660e\u786e<\/strong>\uff1a\u660e\u786e\u5b9a\u4e49\u6570\u636e\u7684\u5f62\u72b6\u3001\u7ea6\u675f\u548c\u884c\u4e3a\u3002<\/p>\n\n\n\n<p><strong>\u6f14\u5316\u53cb\u597d<\/strong>\uff1a\u8bbe\u8ba1\u80fd\u591f\u9002\u5e94\u53d8\u5316\u7684\u6570\u636e\u7ed3\u6784\u3002<\/p>\n\n\n\n<p><strong>\u5de5\u5177\u8f85\u52a9<\/strong>\uff1a\u5229\u7528\u7c7b\u578b\u7cfb\u7edf\u3001\u6d4b\u8bd5\u548c\u6587\u6863\u6765\u786e\u4fdd\u6570\u636e\u8d28\u91cf\u3002<\/p>\n\n\n\n<p>\u901a\u8fc7\u672c\u8bfe\u7684\u5b66\u4e60\uff0c\u4f60\u5e94\u8be5\u638c\u63e1\u4e86\u7ed3\u6784\u4f53\u548c\u7ec4\u5408\u6570\u636e\u7684\u6838\u5fc3\u6982\u5ff5\uff0c\u5e76\u80fd\u591f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\u5e94\u7528\u8fd9\u4e9b\u5f3a\u5927\u7684\u6570\u636e\u5efa\u6a21\u5de5\u5177\uff0c\u521b\u5efa\u66f4\u52a0\u6e05\u6670\u3001\u5b89\u5168\u3001\u53ef\u7ef4\u62a4\u7684\u4ee3\u7801\u3002<\/p>\n\n\n\n<p>\u7b2c\u4e94\u5341\u4e5d\u8bfe\uff1a\u7ed3\u6784\u4f53\u4e0e\u7ec4\u5408\u6570\u636e &#8211; \u6570\u636e\u5efa\u6a21\u7684\u827a\u672f\uff01\u5b8c\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u7b2c\u516d\u5341\u8bfe\uff1a\u95ed\u5305 &#8211; \u51fd\u6570\u4e0e\u5176\u8bcd\u6cd5\u73af\u5883<\/h2>\n\n\n\n<h2 class=\"wp-block-heading\">\u524d\u8a00\uff1a\u4ece\u51fd\u6570\u5230\u95ed\u5305<\/h2>\n\n\n\n<p>\u5728\u7f16\u7a0b\u8bed\u8a00\u7684\u53d1\u5c55\u4e2d\uff0c\u51fd\u6570\u6700\u521d\u53ea\u662f\u6267\u884c\u7279\u5b9a\u4efb\u52a1\u7684\u4ee3\u7801\u5757\u3002\u4f46\u968f\u7740\u51fd\u6570\u5f0f\u7f16\u7a0b\u7684\u5174\u8d77\uff0c\u6211\u4eec\u9010\u6e10\u8ba4\u8bc6\u5230\u51fd\u6570\u4e0d\u4ec5\u4ec5\u662f\u4ee3\u7801\uff0c\u8fd8\u53ef\u4ee5\u643a\u5e26\u72b6\u6001\u3002\u8fd9\u5c31\u662f\u95ed\u5305\uff08Closure\uff09\u8bde\u751f\u7684\u80cc\u666f\u3002<\/p>\n\n\n\n<p>\u95ed\u5305\u662f\u6307\u90a3\u4e9b\u80fd\u591f\u8bbf\u95ee\u81ea\u7531\u53d8\u91cf\u7684\u51fd\u6570\u3002\u81ea\u7531\u53d8\u91cf\u662f\u6307\u5728\u51fd\u6570\u4e2d\u4f7f\u7528\u7684\uff0c\u4f46\u65e2\u4e0d\u662f\u51fd\u6570\u53c2\u6570\u4e5f\u4e0d\u662f\u51fd\u6570\u5c40\u90e8\u53d8\u91cf\u7684\u53d8\u91cf\u3002\u95ed\u5305\u8ba9\u51fd\u6570\u53ef\u4ee5\u201c\u8bb0\u4f4f\u201d\u5b83\u88ab\u521b\u5efa\u65f6\u7684\u73af\u5883\uff0c\u5373\u4f7f\u8fd9\u4e2a\u73af\u5883\u5df2\u7ecf\u4e0d\u518d\u5b58\u5728\u3002<\/p>\n\n\n\n<p>\u4eceJavaScript\u7684\u95ed\u5305\u5230Python\u7684\u5d4c\u5957\u51fd\u6570\uff0c\u4eceLambda\u8868\u8fbe\u5f0f\u5230\u51fd\u6570\u5bf9\u8c61\uff0c\u95ed\u5305\u5df2\u7ecf\u6210\u4e3a\u73b0\u4ee3\u7f16\u7a0b\u8bed\u8a00\u4e0d\u53ef\u6216\u7f3a\u7684\u4e00\u90e8\u5206\u3002<\/p>\n\n\n\n<p>\u4eca\u5929\uff0c\u6211\u4eec\u5c06\u6df1\u5165\u63a2\u7d22\u95ed\u5305\u7684\u4e16\u754c\uff0c\u5b66\u4e60\u5982\u4f55\u5229\u7528\u8fd9\u4e9b\u5f3a\u5927\u7684\u7279\u6027\u6765\u7f16\u5199\u66f4\u7b80\u6d01\u3001\u66f4\u7075\u6d3b\u3001\u66f4\u5f3a\u5927\u7684\u4ee3\u7801\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u7b2c\u4e00\u90e8\u5206\uff1a\u95ed\u5305\u7684\u57fa\u7840\u6982\u5ff5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1.1 \u95ed\u5305\u7684\u5b9e\u8d28\uff1a\u51fd\u6570\u4e0e\u73af\u5883\u7684\u7ed3\u5408<\/h3>\n\n\n\n<p>\u95ed\u5305\u7684\u5b9e\u8d28\u662f\u51fd\u6570\u4e0e\u5176\u8bcd\u6cd5\u73af\u5883\uff08lexical environment\uff09\u7684\u7ed3\u5408\u3002\u8bcd\u6cd5\u73af\u5883\u662f\u6307\u51fd\u6570\u5728\u5b9a\u4e49\u65f6\u6240\u5904\u7684\u73af\u5883\uff0c\u5305\u62ec\u6240\u6709\u53ef\u8bbf\u95ee\u7684\u53d8\u91cf\u3002<\/p>\n\n\n\n<p>python<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><em># ============================================================================<\/em>\n<em># \u95ed\u5305\u7684\u5b9e\u8d28\uff1a\u51fd\u6570\u4e0e\u73af\u5883\u7684\u7ed3\u5408<\/em>\n<em># ============================================================================<\/em>\n\nprint(\"=== \u95ed\u5305\u7684\u5b9e\u8d28\uff1a\u51fd\u6570\u4e0e\u73af\u5883\u7684\u7ed3\u5408 ===\")\n\ndef demonstrate_closure_essence():\n    \"\"\"\u6f14\u793a\u95ed\u5305\u7684\u5b9e\u8d28\"\"\"\n    \n    print(\"\u95ed\u5305\u89e3\u51b3\u7684\u4e09\u4e2a\u6838\u5fc3\u95ee\u9898\uff1a\")\n    print(\"1. \u72b6\u6001\u5c01\u88c5\u95ee\u9898\uff1a\u5c06\u72b6\u6001\u4e0e\u51fd\u6570\u7ed1\u5b9a\")\n    print(\"2. \u6570\u636e\u9690\u79c1\u95ee\u9898\uff1a\u521b\u5efa\u79c1\u6709\u53d8\u91cf\")\n    print(\"3. \u51fd\u6570\u5de5\u5382\u95ee\u9898\uff1a\u52a8\u6001\u751f\u6210\u51fd\u6570\")\n    \n    <em># \u95ed\u5305\u5728\u4e0d\u540c\u8bed\u8a00\u4e2d\u7684\u53d1\u5c55<\/em>\n    print(\"\\n\u95ed\u5305\u5728\u4e0d\u540c\u8bed\u8a00\u4e2d\u7684\u53d1\u5c55\u5386\u7a0b\uff1a\")\n    \n    timeline = [\n        (\"1958\", \"LISP\", \"\u7b2c\u4e00\u4e2a\u652f\u6301\u95ed\u5305\u7684\u8bed\u8a00\", \"Lambda\u8868\u8fbe\u5f0f\u548c\u8bcd\u6cd5\u4f5c\u7528\u57df\"),\n        (\"1975\", \"Scheme\", \"\u95ed\u5305\u4f5c\u4e3a\u4e00\u7b49\u516c\u6c11\", \"\u5b8c\u6574\u7684\u95ed\u5305\u652f\u6301\"),\n        (\"1995\", \"JavaScript\", \"\u51fd\u6570\u4f5c\u7528\u57df\u548c\u95ed\u5305\", \"\u5e7f\u6cdb\u4f7f\u7528\u95ed\u5305\"),\n        (\"2000\", \"Python 2.2\", \"\u5d4c\u5957\u51fd\u6570\u548c\u95ed\u5305\", \"\u4f7f\u7528nonlocal\u5173\u952e\u5b57\"),\n        (\"2004\", \"C# 2.0\", \"\u533f\u540d\u65b9\u6cd5\u548c\u95ed\u5305\", \"Lambda\u8868\u8fbe\u5f0f\"),\n        (\"2011\", \"C++11\", \"Lambda\u8868\u8fbe\u5f0f\", \"\u6355\u83b7\u5217\u8868\"),\n        (\"2014\", \"Java 8\", \"Lambda\u8868\u8fbe\u5f0f\", \"\u6709\u9650\u7684\u95ed\u5305\u652f\u6301\"),\n        (\"2015\", \"Swift\", \"\u95ed\u5305\u4f5c\u4e3a\u4e00\u7b49\u516c\u6c11\", \"\u5f3a\u5f15\u7528\u548c\u5f31\u5f15\u7528\"),\n    ]\n    \n    for year, language, feature, description in timeline:\n        print(f\"  {year}: {language:15} | {feature:30} | {description}\")\n    \n    <em># \u4ece\u666e\u901a\u51fd\u6570\u5230\u95ed\u5305<\/em>\n    print(\"\\n\u4ece\u666e\u901a\u51fd\u6570\u5230\u95ed\u5305\uff1a\")\n    \n    <em># 1. \u666e\u901a\u51fd\u6570<\/em>\n    def normal_function(x):\n        return x * 2\n    \n    print(\"1. \u666e\u901a\u51fd\u6570\uff1a\")\n    print(f\"   normal_function(5) = {normal_function(5)}\")\n    print(f\"   \u6ca1\u6709\u72b6\u6001\uff0c\u6bcf\u6b21\u8c03\u7528\u76f8\u540c\u8f93\u5165\u5f97\u5230\u76f8\u540c\u8f93\u51fa\")\n    \n    <em># 2. \u4f7f\u7528\u5168\u5c40\u72b6\u6001<\/em>\n    counter = 0\n    \n    def function_with_global_state():\n        global counter\n        counter += 1\n        return counter\n    \n    print(\"\\n2. \u4f7f\u7528\u5168\u5c40\u72b6\u6001\uff1a\")\n    print(f\"   \u7b2c\u4e00\u6b21\u8c03\u7528: {function_with_global_state()}\")\n    print(f\"   \u7b2c\u4e8c\u6b21\u8c03\u7528: {function_with_global_state()}\")\n    print(f\"   \u95ee\u9898\uff1a\u5168\u5c40\u72b6\u6001\u5bb9\u6613\u88ab\u4fee\u6539\uff0c\u4e0d\u5b89\u5168\")\n    \n    <em># 3. \u4f7f\u7528\u95ed\u5305<\/em>\n    def make_counter():\n        count = 0  <em># \u5c40\u90e8\u53d8\u91cf\uff0c\u4f46\u4f1a\u88ab\u5185\u90e8\u51fd\u6570\u5f15\u7528<\/em>\n        \n        def counter():\n            nonlocal count  <em># Python 3\u4e2d\u9700\u8981\u4f7f\u7528nonlocal<\/em>\n            count += 1\n            return count\n        \n        return counter\n    \n    print(\"\\n3. \u4f7f\u7528\u95ed\u5305\uff1a\")\n    my_counter = make_counter()\n    print(f\"   \u7b2c\u4e00\u6b21\u8c03\u7528: {my_counter()}\")\n    print(f\"   \u7b2c\u4e8c\u6b21\u8c03\u7528: {my_counter()}\")\n    print(f\"   \u72b6\u6001\u88ab\u5c01\u88c5\u5728\u95ed\u5305\u4e2d\uff0c\u5b89\u5168\u4e14\u79c1\u6709\")\n    \n    <em># \u4e0d\u540c\u8bed\u8a00\u7684\u95ed\u5305\u5b9e\u73b0\u5bf9\u6bd4<\/em>\n    print(\"\\n\u4e0d\u540c\u8bed\u8a00\u7684\u95ed\u5305\u5b9e\u73b0\uff1a\")\n    \n    implementations = {\n        \"JavaScript\": {\n            \"\u7279\u70b9\": \"\u57fa\u4e8e\u51fd\u6570\u4f5c\u7528\u57df\uff0c\u95ed\u5305\u65e0\u5904\u4e0d\u5728\",\n            \"\u793a\u4f8b\": \"\"\"\n\/\/ \u521b\u5efa\u95ed\u5305\nfunction makeCounter() {\n    let count = 0;\n    return function() {\n        count++;\n        return count;\n    };\n}\n\n\/\/ \u4f7f\u7528\nconst counter = makeCounter();\nconsole.log(counter()); \/\/ 1\nconsole.log(counter()); \/\/ 2\n\n\/\/ \u6bcf\u4e2a\u95ed\u5305\u6709\u81ea\u5df1\u7684\u72b6\u6001\nconst counter2 = makeCounter();\nconsole.log(counter2()); \/\/ 1 (\u72ec\u7acb)\n\"\"\",\n            \"\u5185\u5b58\u7ba1\u7406\": \"\u5783\u573e\u56de\u6536\uff0c\u5faa\u73af\u5f15\u7528\u53ef\u80fd\u5bfc\u81f4\u5185\u5b58\u6cc4\u6f0f\"\n        },\n        \"Python\": {\n            \"\u7279\u70b9\": \"\u4f7f\u7528nonlocal\u6216\u53ef\u53d8\u5bf9\u8c61\u4fee\u6539\u5916\u90e8\u53d8\u91cf\",\n            \"\u793a\u4f8b\": \"\"\"\ndef make_counter():\n    count = 0\n    def counter():\n        nonlocal count  # Python 3\u9700\u8981\n        count += 1\n        return count\n    return counter\n\n# \u4f7f\u7528\ncounter = make_counter()\nprint(counter())  # 1\nprint(counter())  # 2\n\n# \u53e6\u4e00\u79cd\u65b9\u5f0f\uff1a\u4f7f\u7528\u53ef\u53d8\u5bf9\u8c61\ndef make_counter2():\n    count = [0]\n    def counter():\n        count[0] += 1\n        return count[0]\n    return counter\n\"\"\",\n            \"\u5185\u5b58\u7ba1\u7406\": \"\u5f15\u7528\u8ba1\u6570\u548c\u5783\u573e\u56de\u6536\"\n        },\n        \"C++\": {\n            \"\u7279\u70b9\": \"Lambda\u8868\u8fbe\u5f0f\uff0c\u663e\u5f0f\u6355\u83b7\u5217\u8868\",\n            \"\u793a\u4f8b\": \"\"\"\n\/\/ \u521b\u5efa\u95ed\u5305\nauto make_counter() {\n    int count = 0;\n    \/\/ Lambda\u8868\u8fbe\u5f0f\uff0c\u6309\u5f15\u7528\u6355\u83b7count\n    auto counter = [&amp;count]() {\n        count++;\n        return count;\n    };\n    return counter;\n}\n\n\/\/ \u6ce8\u610f\uff1a\u8fd4\u56de\u7684\u95ed\u5305\u4e0d\u80fd\u8d85\u8fc7count\u7684\u751f\u547d\u5468\u671f\n\/\/ \u5b89\u5168\u7684\u65b9\u5f0f\uff1a\u5c06count\u4e5f\u6355\u83b7\u5230\u95ed\u5305\u4e2d\nauto make_safe_counter() {\n    return [count = 0]() mutable {\n        count++;\n        return count;\n    };\n}\n\n\/\/ \u4f7f\u7528\nauto counter = make_safe_counter();\ncout &lt;&lt; counter() &lt;&lt; endl; \/\/ 1\ncout &lt;&lt; counter() &lt;&lt; endl; \/\/ 2\n\"\"\",\n            \"\u5185\u5b58\u7ba1\u7406\": \"\u624b\u52a8\u5185\u5b58\u7ba1\u7406\uff0cLambda\u6355\u83b7\u65b9\u5f0f\u51b3\u5b9a\u751f\u547d\u5468\u671f\"\n        },\n        \"C#\": {\n            \"\u7279\u70b9\": \"Lambda\u8868\u8fbe\u5f0f\u548c\u533f\u540d\u65b9\u6cd5\uff0c\u81ea\u52a8\u6355\u83b7\",\n            \"\u793a\u4f8b\": \"\"\"\n\/\/ \u521b\u5efa\u95ed\u5305\nFunc&lt;int&gt; MakeCounter() {\n    int count = 0;\n    \/\/ Lambda\u8868\u8fbe\u5f0f\u81ea\u52a8\u6355\u83b7count\n    return () =&gt; {\n        count++;\n        return count;\n    };\n}\n\n\/\/ \u4f7f\u7528\nvar counter = MakeCounter();\nConsole.WriteLine(counter()); \/\/ 1\nConsole.WriteLine(counter()); \/\/ 2\n\"\"\",\n            \"\u5185\u5b58\u7ba1\u7406\": \"\u5783\u573e\u56de\u6536\uff0c\u81ea\u52a8\u7ba1\u7406\u751f\u547d\u5468\u671f\"\n        },\n        \"Java\": {\n            \"\u7279\u70b9\": \"Lambda\u8868\u8fbe\u5f0f\uff0c\u4f46\u53ea\u80fd\u6355\u83b7final\u6216\u7b49\u6548final\u7684\u53d8\u91cf\",\n            \"\u793a\u4f8b\": \"\"\"\n\/\/ Java\u4e2d\u7684\u95ed\u5305\u6709\u9650\u5236\nimport java.util.function.Supplier;\n\npublic class ClosureExample {\n    public static Supplier&lt;Integer&gt; makeCounter() {\n        final int[] count = {0};  \/\/ \u4f7f\u7528\u6570\u7ec4\u6765\u7ed5\u8fc7final\u9650\u5236\n        return () -&gt; {\n            count[0]++;\n            return count[0];\n        };\n    }\n    \n    public static void main(String[] args) {\n        Supplier&lt;Integer&gt; counter = makeCounter();\n        System.out.println(counter.get()); \/\/ 1\n        System.out.println(counter.get()); \/\/ 2\n    }\n}\n\"\"\",\n            \"\u5185\u5b58\u7ba1\u7406\": \"\u5783\u573e\u56de\u6536\uff0c\u4f46\u95ed\u5305\u529f\u80fd\u6709\u9650\"\n        },\n        \"Go\": {\n            \"\u7279\u70b9\": \"\u533f\u540d\u51fd\u6570\uff0c\u6355\u83b7\u53d8\u91cf\u901a\u8fc7\u95ed\u5305\u5f15\u7528\",\n            \"\u793a\u4f8b\": \"\"\"\n\/\/ \u521b\u5efa\u95ed\u5305\nfunc makeCounter() func() int {\n    count := 0\n    return func() int {\n        count++\n        return count\n    }\n}\n\n\/\/ \u4f7f\u7528\ncounter := makeCounter()\nfmt.Println(counter()) \/\/ 1\nfmt.Println(counter()) \/\/ 2\n\"\"\",\n            \"\u5185\u5b58\u7ba1\u7406\": \"\u5783\u573e\u56de\u6536\uff0c\u81ea\u52a8\u7ba1\u7406\"\n        },\n        \"Rust\": {\n            \"\u7279\u70b9\": \"\u95ed\u5305\u662ftrait\u5bf9\u8c61\uff0c\u6709\u4e09\u79cd\u7c7b\u578b\uff1aFn\u3001FnMut\u3001FnOnce\",\n            \"\u793a\u4f8b\": \"\"\"\n\/\/ \u521b\u5efa\u95ed\u5305\nfn make_counter() -&gt; impl FnMut() -&gt; i32 {\n    let mut count = 0;\n    \/\/ move\u5173\u952e\u5b57\u53d6\u5f97count\u7684\u6240\u6709\u6743\n    move || {\n        count += 1;\n        count\n    }\n}\n\n\/\/ \u4f7f\u7528\nlet mut counter = make_counter();\nprintln!(\"{}\", counter()); \/\/ 1\nprintln!(\"{}\", counter()); \/\/ 2\n\"\"\",\n            \"\u5185\u5b58\u7ba1\u7406\": \"\u6240\u6709\u6743\u7cfb\u7edf\uff0c\u786e\u4fdd\u5185\u5b58\u5b89\u5168\"\n        },\n        \"Swift\": {\n            \"\u7279\u70b9\": \"\u95ed\u5305\u662f\u5f15\u7528\u7c7b\u578b\uff0c\u81ea\u52a8\u6355\u83b7\u4e0a\u4e0b\u6587\",\n            \"\u793a\u4f8b\": \"\"\"\n\/\/ \u521b\u5efa\u95ed\u5305\nfunc makeCounter() -&gt; () -&gt; Int {\n    var count = 0\n    return {\n        count += 1\n        return count\n    }\n}\n\n\/\/ \u4f7f\u7528\nlet counter = makeCounter()\nprint(counter()) \/\/ 1\nprint(counter()) \/\/ 2\n\"\"\",\n            \"\u5185\u5b58\u7ba1\u7406\": \"ARC\uff08\u81ea\u52a8\u5f15\u7528\u8ba1\u6570\uff09\uff0c\u6ce8\u610f\u5faa\u73af\u5f15\u7528\"\n        }\n    }\n    \n    for lang, info in implementations.items():\n        print(f\"\\n{lang}:\")\n        print(f\"  \u7279\u70b9: {info['\u7279\u70b9']}\")\n        print(f\"  \u793a\u4f8b: {info['\u793a\u4f8b'].strip()}\")\n        if '\u5185\u5b58\u7ba1\u7406' in info:\n            print(f\"  \u5185\u5b58\u7ba1\u7406: {info['\u5185\u5b58\u7ba1\u7406']}\")\n    \n    <em># \u95ed\u5305\u7684\u56db\u4e2a\u6838\u5fc3\u4ef7\u503c<\/em>\n    print(\"\\n\u95ed\u5305\u7684\u56db\u4e2a\u6838\u5fc3\u4ef7\u503c\uff1a\")\n    \n    values = [\n        (\"\u72b6\u6001\u5c01\u88c5\", \"\u5c06\u72b6\u6001\u4e0e\u64cd\u4f5c\u72b6\u6001\u7684\u51fd\u6570\u7ed1\u5b9a\", \"\u521b\u5efa\u6709\u72b6\u6001\u7684\u51fd\u6570\"),\n        (\"\u6570\u636e\u9690\u79c1\", \"\u521b\u5efa\u79c1\u6709\u53d8\u91cf\", \"\u53ea\u80fd\u901a\u8fc7\u95ed\u5305\u8bbf\u95ee\"),\n        (\"\u51fd\u6570\u5de5\u5382\", \"\u52a8\u6001\u751f\u6210\u51fd\u6570\", \"\u6839\u636e\u53c2\u6570\u521b\u5efa\u4e0d\u540c\u51fd\u6570\"),\n        (\"\u56de\u8c03\u51fd\u6570\", \"\u643a\u5e26\u4e0a\u4e0b\u6587\u4fe1\u606f\", \"\u4e8b\u4ef6\u5904\u7406\u3001\u5f02\u6b65\u7f16\u7a0b\"),\n    ]\n    \n    for value, mechanism, benefit in values:\n        print(f\"  \u2022 {value:15} | {mechanism:25} | -&gt; {benefit}\")\n\n<em># \u8fd0\u884c\u6f14\u793a<\/em>\ndemonstrate_closure_essence()<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">1.2 Python\u95ed\u5305\u7684\u6df1\u5165\u4f7f\u7528<\/h3>\n\n\n\n<p>\u8ba9\u6211\u4eec\u6df1\u5165\u63a2\u7d22Python\u4e2d\u95ed\u5305\u7684\u5404\u79cd\u7528\u6cd5\u3002<\/p>\n\n\n\n<p>python<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><em># ============================================================================<\/em>\n<em># Python\u95ed\u5305\u7684\u6df1\u5165\u4f7f\u7528<\/em>\n<em># ============================================================================<\/em>\n\nprint(\"\\n=== Python\u95ed\u5305\u7684\u6df1\u5165\u4f7f\u7528 ===\")\n\ndef demonstrate_python_closures():\n    \"\"\"\u6f14\u793aPython\u95ed\u5305\u7684\u9ad8\u7ea7\u7528\u6cd5\"\"\"\n    \n    import time\n    import functools\n    \n    <em># 1. \u57fa\u672c\u95ed\u5305<\/em>\n    print(\"1. \u57fa\u672c\u95ed\u5305\uff1a\")\n    \n    def outer_function(msg):\n        \"\"\"\u5916\u90e8\u51fd\u6570\"\"\"\n        message = msg  <em># \u81ea\u7531\u53d8\u91cf<\/em>\n        \n        def inner_function():\n            \"\"\"\u5185\u90e8\u51fd\u6570 - \u95ed\u5305\"\"\"\n            return f\"\u6d88\u606f: {message}\"\n        \n        return inner_function\n    \n    hello_func = outer_function(\"\u4f60\u597d\")\n    goodbye_func = outer_function(\"\u518d\u89c1\")\n    \n    print(f\"hello_func: {hello_func()}\")\n    print(f\"goodbye_func: {goodbye_func()}\")\n    \n    <em># \u68c0\u67e5\u95ed\u5305\u5c5e\u6027<\/em>\n    print(f\"\\n\u95ed\u5305\u5c5e\u6027\u68c0\u67e5\uff1a\")\n    print(f\"hello_func.__closure__: {hello_func.__closure__}\")\n    print(f\"hello_func.__code__.co_freevars: {hello_func.__code__.co_freevars}\")\n    \n    if hello_func.__closure__:\n        cell = hello_func.__closure__[0]\n        print(f\"\u95ed\u5305\u5355\u5143\u683c\u5185\u5bb9: {cell.cell_contents}\")\n    \n    <em># 2. \u5e26\u53c2\u6570\u7684\u95ed\u5305<\/em>\n    print(\"\\n2. \u5e26\u53c2\u6570\u7684\u95ed\u5305\uff1a\")\n    \n    def power_factory(exponent):\n        \"\"\"\u521b\u5efa\u5e42\u51fd\u6570\"\"\"\n        def power(base):\n            return base ** exponent\n        return power\n    \n    square = power_factory(2)\n    cube = power_factory(3)\n    \n    print(f\"square(5) = {square(5)}\")  <em># 25<\/em>\n    print(f\"cube(5) = {cube(5)}\")      <em># 125<\/em>\n    \n    <em># 3. \u4fee\u6539\u5916\u90e8\u53d8\u91cf<\/em>\n    print(\"\\n3. \u4fee\u6539\u5916\u90e8\u53d8\u91cf\uff1a\")\n    \n    def counter_factory():\n        \"\"\"\u8ba1\u6570\u5668\u5de5\u5382\"\"\"\n        count = 0\n        \n        def increment():\n            nonlocal count\n            count += 1\n            return count\n        \n        def decrement():\n            nonlocal count\n            count -= 1\n            return count\n        \n        def get_count():\n            return count\n        \n        def reset():\n            nonlocal count\n            count = 0\n        \n        <em># \u8fd4\u56de\u591a\u4e2a\u95ed\u5305\u51fd\u6570<\/em>\n        return increment, decrement, get_count, reset\n    \n    inc, dec, get, reset = counter_factory()\n    \n    print(f\"\u521d\u59cb\u8ba1\u6570: {get()}\")\n    print(f\"\u589e\u52a0\u540e: {inc()}\")\n    print(f\"\u589e\u52a0\u540e: {inc()}\")\n    print(f\"\u51cf\u5c11\u540e: {dec()}\")\n    reset()\n    print(f\"\u91cd\u7f6e\u540e: {get()}\")\n    \n    <em># 4. \u95ed\u5305\u4e0e\u88c5\u9970\u5668<\/em>\n    print(\"\\n4. \u95ed\u5305\u4e0e\u88c5\u9970\u5668\uff1a\")\n    \n    def logger(func):\n        \"\"\"\u65e5\u5fd7\u88c5\u9970\u5668\"\"\"\n        @functools.wraps(func)\n        def wrapper(*args, **kwargs):\n            print(f\"[LOG] \u8c03\u7528 {func.__name__}\uff0c\u53c2\u6570: {args}, {kwargs}\")\n            result = func(*args, **kwargs)\n            print(f\"[LOG] {func.__name__} \u8fd4\u56de: {result}\")\n            return result\n        return wrapper\n    \n    @logger\n    def add(a, b):\n        return a + b\n    \n    print(\"\u88c5\u9970\u5668\u672c\u8d28\u4e0a\u662f\u95ed\u5305\uff1a\")\n    print(f\"add(3, 5) = {add(3, 5)}\")\n    \n    <em># 5. \u95ed\u5305\u4e0e\u51fd\u6570\u67ef\u91cc\u5316<\/em>\n    print(\"\\n5. \u95ed\u5305\u4e0e\u51fd\u6570\u67ef\u91cc\u5316\uff1a\")\n    \n    def curry(func):\n        \"\"\"\u67ef\u91cc\u5316\u88c5\u9970\u5668\"\"\"\n        @functools.wraps(func)\n        def curried(*args, **kwargs):\n            if len(args) + len(kwargs) &gt;= func.__code__.co_argcount:\n                return func(*args, **kwargs)\n            \n            def partial(*more_args, **more_kwargs):\n                new_args = args + more_args\n                new_kwargs = {**kwargs, **more_kwargs}\n                return curried(*new_args, **new_kwargs)\n            \n            return partial\n        return curried\n    \n    @curry\n    def multiply(a, b, c):\n        return a * b * c\n    \n    print(\"\u67ef\u91cc\u5316\u793a\u4f8b\uff1a\")\n    print(f\"multiply(2, 3, 4) = {multiply(2, 3, 4)}\")\n    print(f\"multiply(2)(3)(4) = {multiply(2)(3)(4)}\")\n    print(f\"multiply(2, 3)(4) = {multiply(2, 3)(4)}\")\n    \n    double = multiply(2)  <em># \u90e8\u5206\u5e94\u7528<\/em>\n    print(f\"double(5, 6) = {double(5, 6)}\")  <em># 2 * 5 * 6 = 60<\/em>\n    \n    <em># 6. \u95ed\u5305\u4e0e\u56de\u8c03\u51fd\u6570<\/em>\n    print(\"\\n6. \u95ed\u5305\u4e0e\u56de\u8c03\u51fd\u6570\uff1a\")\n    \n    def event_handler_factory():\n        \"\"\"\u4e8b\u4ef6\u5904\u7406\u5668\u5de5\u5382\"\"\"\n        handlers = []\n        \n        def register_handler(handler):\n            \"\"\"\u6ce8\u518c\u4e8b\u4ef6\u5904\u7406\u5668\"\"\"\n            handlers.append(handler)\n            print(f\"\u6ce8\u518c\u5904\u7406\u5668: {handler.__name__}\")\n        \n        def unregister_handler(handler):\n            \"\"\"\u6ce8\u9500\u4e8b\u4ef6\u5904\u7406\u5668\"\"\"\n            if handler in handlers:\n                handlers.remove(handler)\n                print(f\"\u6ce8\u9500\u5904\u7406\u5668: {handler.__name__}\")\n        \n        def trigger_event(event_data):\n            \"\"\"\u89e6\u53d1\u4e8b\u4ef6\"\"\"\n            print(f\"\u89e6\u53d1\u4e8b\u4ef6: {event_data}\")\n            for handler in handlers:\n                handler(event_data)\n        \n        return register_handler, unregister_handler, trigger_event\n    \n    register, unregister, trigger = event_handler_factory()\n    \n    def email_notifier(data):\n        print(f\"  \u53d1\u9001\u90ae\u4ef6\u901a\u77e5: {data}\")\n    \n    def sms_notifier(data):\n        print(f\"  \u53d1\u9001\u77ed\u4fe1\u901a\u77e5: {data}\")\n    \n    register(email_notifier)\n    register(sms_notifier)\n    \n    print(\"\u89e6\u53d1\u4e8b\u4ef6:\")\n    trigger(\"\u7528\u6237\u767b\u5f55\")\n    \n    unregister(sms_notifier)\n    print(\"\\n\u79fb\u9664\u77ed\u4fe1\u901a\u77e5\u540e\u89e6\u53d1\u4e8b\u4ef6:\")\n    trigger(\"\u8ba2\u5355\u521b\u5efa\")\n    \n    <em># 7. \u95ed\u5305\u4e0e\u72b6\u6001\u673a<\/em>\n    print(\"\\n7. \u95ed\u5305\u4e0e\u72b6\u6001\u673a\uff1a\")\n    \n    def state_machine_factory(initial_state):\n        \"\"\"\u72b6\u6001\u673a\u5de5\u5382\"\"\"\n        state = initial_state\n        transitions = {}\n        \n        def add_transition(from_state, to_state, condition):\n            \"\"\"\u6dfb\u52a0\u72b6\u6001\u8f6c\u79fb\"\"\"\n            if from_state not in transitions:\n                transitions[from_state] = []\n            transitions[from_state].append((to_state, condition))\n        \n        def process_event(event):\n            \"\"\"\u5904\u7406\u4e8b\u4ef6\"\"\"\n            nonlocal state\n            \n            if state not in transitions:\n                print(f\"\u72b6\u6001 {state} \u6ca1\u6709\u8f6c\u79fb\u89c4\u5219\")\n                return state\n            \n            for to_state, condition in transitions[state]:\n                if condition(event):\n                    old_state = state\n                    state = to_state\n                    print(f\"\u72b6\u6001\u8f6c\u79fb: {old_state} -&gt; {state} (\u4e8b\u4ef6: {event})\")\n                    return state\n            \n            print(f\"\u72b6\u6001 {state} \u6ca1\u6709\u5339\u914d\u7684\u4e8b\u4ef6 {event}\")\n            return state\n        \n        def get_state():\n            return state\n        \n        return add_transition, process_event, get_state\n    \n    <em># \u521b\u5efa\u72b6\u6001\u673a\uff1a\u7b80\u5355\u7684\u5de5\u4f5c\u6d41<\/em>\n    add_transition, process_event, get_state = state_machine_factory(\"\u5f85\u5904\u7406\")\n    \n    <em># \u5b9a\u4e49\u72b6\u6001\u8f6c\u79fb\u89c4\u5219<\/em>\n    add_transition(\"\u5f85\u5904\u7406\", \"\u5904\u7406\u4e2d\", lambda e: e == \"\u5f00\u59cb\u5904\u7406\")\n    add_transition(\"\u5904\u7406\u4e2d\", \"\u5df2\u5b8c\u6210\", lambda e: e == \"\u5b8c\u6210\u5904\u7406\")\n    add_transition(\"\u5904\u7406\u4e2d\", \"\u5f85\u5904\u7406\", lambda e: e == \"\u91cd\u65b0\u5904\u7406\")\n    add_transition(\"\u5df2\u5b8c\u6210\", \"\u5f85\u5904\u7406\", lambda e: e == \"\u91cd\u7f6e\")\n    \n    print(\"\u72b6\u6001\u673a\u793a\u4f8b\uff1a\")\n    events = [\"\u5f00\u59cb\u5904\u7406\", \"\u5b8c\u6210\u5904\u7406\", \"\u91cd\u7f6e\", \"\u5f00\u59cb\u5904\u7406\", \"\u91cd\u65b0\u5904\u7406\", \"\u5f00\u59cb\u5904\u7406\", \"\u5b8c\u6210\u5904\u7406\"]\n    \n    for event in events:\n        process_event(event)\n    \n    print(f\"\u6700\u7ec8\u72b6\u6001: {get_state()}\")\n    \n    <em># 8. \u95ed\u5305\u4e0e\u8bb0\u5fc6\u5316\uff08Memoization\uff09<\/em>\n    print(\"\\n8. \u95ed\u5305\u4e0e\u8bb0\u5fc6\u5316\uff08Memoization\uff09\uff1a\")\n    \n    def memoize(func):\n        \"\"\"\u8bb0\u5fc6\u5316\u88c5\u9970\u5668\"\"\"\n        cache = {}\n        \n        @functools.wraps(func)\n        def memoized(*args):\n            if args in cache:\n                print(f\"  \u7f13\u5b58\u547d\u4e2d: {func.__name__}{args}\")\n                return cache[args]\n            \n            result = func(*args)\n            cache[args] = result\n            print(f\"  \u7f13\u5b58\u6dfb\u52a0: {func.__name__}{args} = {result}\")\n            return result\n        \n        return memoized\n    \n    @memoize\n    def fibonacci(n):\n        \"\"\"\u6590\u6ce2\u90a3\u5951\u6570\u5217\"\"\"\n        if n &lt;= 1:\n            return n\n        return fibonacci(n-1) + fibonacci(n-2)\n    \n    print(\"\u8bb0\u5fc6\u5316\u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\")\n    print(f\"fibonacci(10) = {fibonacci(10)}\")\n    print(f\"fibonacci(10) \u518d\u6b21\u8c03\u7528:\")\n    print(f\"fibonacci(10) = {fibonacci(10)}\")\n    \n    <em># 9. \u95ed\u5305\u4e0e\u5ef6\u8fdf\u8ba1\u7b97<\/em>\n    print(\"\\n9. \u95ed\u5305\u4e0e\u5ef6\u8fdf\u8ba1\u7b97\uff1a\")\n    \n    def lazy_value(computation):\n        \"\"\"\u521b\u5efa\u5ef6\u8fdf\u8ba1\u7b97\u7684\u503c\"\"\"\n        computed = False\n        value = None\n        \n        def get():\n            nonlocal computed, value\n            if not computed:\n                print(\"  \u6267\u884c\u8ba1\u7b97...\")\n                value = computation()\n                computed = True\n            return value\n        \n        return get\n    \n    print(\"\u5ef6\u8fdf\u8ba1\u7b97\u793a\u4f8b\uff1a\")\n    lazy_sum = lazy_value(lambda: sum(range(1000000)))  <em># \u6602\u8d35\u7684\u8ba1\u7b97<\/em>\n    \n    print(\"\u521b\u5efa\u5ef6\u8fdf\u8ba1\u7b97\u5bf9\u8c61\uff08\u5c1a\u672a\u8ba1\u7b97\uff09\")\n    print(\"\u7b2c\u4e00\u6b21\u83b7\u53d6\u503c\uff08\u89e6\u53d1\u8ba1\u7b97\uff09:\")\n    start = time.time()\n    result1 = lazy_sum()\n    elapsed = time.time() - start\n    print(f\"  \u7ed3\u679c: {result1}, \u8017\u65f6: {elapsed:.4f}\u79d2\")\n    \n    print(\"\u7b2c\u4e8c\u6b21\u83b7\u53d6\u503c\uff08\u4ece\u7f13\u5b58\u83b7\u53d6\uff09:\")\n    start = time.time()\n    result2 = lazy_sum()\n    elapsed = time.time() - start\n    print(f\"  \u7ed3\u679c: {result2}, \u8017\u65f6: {elapsed:.4f}\u79d2\")\n    \n    <em># 10. \u95ed\u5305\u4e0e\u5bf9\u8c61\u7cfb\u7edf<\/em>\n    print(\"\\n10. \u95ed\u5305\u4e0e\u5bf9\u8c61\u7cfb\u7edf\uff1a\")\n    \n    def create_person(name, age):\n        \"\"\"\u4f7f\u7528\u95ed\u5305\u521b\u5efa\u5bf9\u8c61\"\"\"\n        \n        <em># \u79c1\u6709\u53d8\u91cf<\/em>\n        _name = name\n        _age = age\n        _friends = []\n        \n        <em># \u516c\u5171\u63a5\u53e3<\/em>\n        def get_name():\n            return _name\n        \n        def get_age():\n            return _age\n        \n        def set_age(new_age):\n            nonlocal _age\n            if new_age &gt;= 0:\n                _age = new_age\n                return True\n            return False\n        \n        def add_friend(friend):\n            if friend not in _friends:\n                _friends.append(friend)\n                return True\n            return False\n        \n        def get_friends():\n            return _friends.copy()  <em># \u8fd4\u56de\u526f\u672c\u4ee5\u4fdd\u62a4\u5185\u90e8\u72b6\u6001<\/em>\n        \n        def greet(other_person):\n            other_name = other_person.get_name() if callable(getattr(other_person, 'get_name', None)) else str(other_person)\n            return f\"\u4f60\u597d\uff0c{other_name}\uff01\u6211\u662f{_name}\u3002\"\n        \n        <em># \u8fd4\u56de\u516c\u5171\u65b9\u6cd5<\/em>\n        return {\n            'get_name': get_name,\n            'get_age': get_age,\n            'set_age': set_age,\n            'add_friend': add_friend,\n            'get_friends': get_friends,\n            'greet': greet,\n        }\n    \n    print(\"\u4f7f\u7528\u95ed\u5305\u5b9e\u73b0\u5bf9\u8c61\uff1a\")\n    \n    alice = create_person(\"Alice\", 30)\n    bob = create_person(\"Bob\", 25)\n    \n    print(f\"Alice: {alice.get_name()}, {alice.get_age()}\u5c81\")\n    print(f\"Bob: {bob.get_name()}, {bob.get_age()}\u5c81\")\n    \n    alice.add_friend(bob)\n    bob.add_friend(alice)\n    \n    print(f\"Alice\u7684\u670b\u53cb: {[f.get_name() for f in alice.get_friends()]}\")\n    print(f\"Bob\u7684\u670b\u53cb: {[f.get_name() for f in bob.get_friends()]}\")\n    \n    print(f\"Alice\u6253\u62db\u547c: {alice.greet(bob)}\")\n    print(f\"Bob\u6253\u62db\u547c: {bob.greet(alice)}\")\n    \n    <em># \u5c1d\u8bd5\u8bbf\u95ee\u79c1\u6709\u53d8\u91cf\uff08\u5e94\u8be5\u5931\u8d25\uff09<\/em>\n    print(f\"\\n\u5c1d\u8bd5\u8bbf\u95ee\u79c1\u6709\u53d8\u91cf:\")\n    try:\n        print(f\"  alice._name: \u4e0d\u53ef\u8bbf\u95ee\")\n    except AttributeError as e:\n        print(f\"  \u6b63\u786e\u6355\u83b7\u9519\u8bef: {e}\")\n\n<em># \u8fd0\u884c\u6f14\u793a<\/em>\ndemonstrate_python_closures()<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u7b2c\u4e8c\u90e8\u5206\uff1a\u95ed\u5305\u7684\u9ad8\u7ea7\u6a21\u5f0f<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">2.1 \u95ed\u5305\u5728\u5f02\u6b65\u7f16\u7a0b\u4e2d\u7684\u5e94\u7528<\/h3>\n\n\n\n<p>\u95ed\u5305\u5728\u5f02\u6b65\u7f16\u7a0b\u4e2d\u6709\u7740\u5e7f\u6cdb\u7684\u5e94\u7528\uff0c\u7279\u522b\u662f\u5728\u4e8b\u4ef6\u5904\u7406\u548c\u56de\u8c03\u51fd\u6570\u4e2d\u3002<\/p>\n\n\n\n<p>python<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><em># ============================================================================<\/em>\n<em># \u95ed\u5305\u5728\u5f02\u6b65\u7f16\u7a0b\u4e2d\u7684\u5e94\u7528<\/em>\n<em># ============================================================================<\/em>\n\nprint(\"\\n=== \u95ed\u5305\u5728\u5f02\u6b65\u7f16\u7a0b\u4e2d\u7684\u5e94\u7528 ===\")\n\ndef demonstrate_async_closures():\n    \"\"\"\u6f14\u793a\u95ed\u5305\u5728\u5f02\u6b65\u7f16\u7a0b\u4e2d\u7684\u5e94\u7528\"\"\"\n    \n    import asyncio\n    import time\n    from typing import Callable, List\n    \n    <em># 1. \u5f02\u6b65\u56de\u8c03<\/em>\n    print(\"1. \u5f02\u6b65\u56de\u8c03\uff1a\")\n    \n    class AsyncEventEmitter:\n        \"\"\"\u5f02\u6b65\u4e8b\u4ef6\u53d1\u5c04\u5668\"\"\"\n        \n        def __init__(self):\n            self._listeners = {}\n        \n        def on(self, event: str, callback: Callable):\n            \"\"\"\u6ce8\u518c\u4e8b\u4ef6\u76d1\u542c\u5668\"\"\"\n            if event not in self._listeners:\n                self._listeners[event] = []\n            self._listeners[event].append(callback)\n        \n        async def emit(self, event: str, *args, **kwargs):\n            \"\"\"\u89e6\u53d1\u4e8b\u4ef6\"\"\"\n            if event in self._listeners:\n                for callback in self._listeners[event]:\n                    <em># \u5982\u679c\u662f\u5f02\u6b65\u51fd\u6570\u5219\u7b49\u5f85<\/em>\n                    if asyncio.iscoroutinefunction(callback):\n                        await callback(*args, **kwargs)\n                    else:\n                        callback(*args, **kwargs)\n    \n    async def demo_async_callbacks():\n        \"\"\"\u6f14\u793a\u5f02\u6b65\u56de\u8c03\"\"\"\n        emitter = AsyncEventEmitter()\n        \n        <em># \u540c\u6b65\u56de\u8c03<\/em>\n        def sync_callback(data):\n            print(f\"  \u540c\u6b65\u56de\u8c03: \u5904\u7406\u6570\u636e {data}\")\n        \n        <em># \u5f02\u6b65\u56de\u8c03<\/em>\n        async def async_callback(data):\n            await asyncio.sleep(0.1)\n            print(f\"  \u5f02\u6b65\u56de\u8c03: \u5904\u7406\u6570\u636e {data}\")\n        \n        <em># \u4f7f\u7528\u95ed\u5305\u521b\u5efa\u56de\u8c03<\/em>\n        def create_callback_with_context(context):\n            async def callback(data):\n                await asyncio.sleep(0.05)\n                print(f\"  \u5e26\u4e0a\u4e0b\u6587\u7684\u56de\u8c03: [{context}] \u5904\u7406\u6570\u636e {data}\")\n            return callback\n        \n        <em># \u6ce8\u518c\u56de\u8c03<\/em>\n        emitter.on(\"data\", sync_callback)\n        emitter.on(\"data\", async_callback)\n        emitter.on(\"data\", create_callback_with_context(\"\u7528\u6237\"))\n        \n        print(\"\u89e6\u53d1\u4e8b\u4ef6:\")\n        await emitter.emit(\"data\", \"\u6d4b\u8bd5\u6570\u636e\")\n    \n    <em># \u8fd0\u884c\u5f02\u6b65\u6f14\u793a<\/em>\n    asyncio.run(demo_async_callbacks())\n    \n    <em># 2. \u5f02\u6b65\u4efb\u52a1\u7ba1\u7406<\/em>\n    print(\"\\n2. \u5f02\u6b65\u4efb\u52a1\u7ba1\u7406\uff1a\")\n    \n    def create_task_manager():\n        \"\"\"\u521b\u5efa\u4efb\u52a1\u7ba1\u7406\u5668\"\"\"\n        tasks = []\n        \n        async def add_task(coro, name=None):\n            \"\"\"\u6dfb\u52a0\u4efb\u52a1\"\"\"\n            task = asyncio.create_task(coro)\n            tasks.append((name, task))\n            print(f\"  \u6dfb\u52a0\u4efb\u52a1: {name or '\u533f\u540d\u4efb\u52a1'}\")\n            return task\n        \n        async def cancel_all():\n            \"\"\"\u53d6\u6d88\u6240\u6709\u4efb\u52a1\"\"\"\n            cancelled = 0\n            for name, task in tasks:\n                if not task.done():\n                    task.cancel()\n                    cancelled += 1\n                    print(f\"  \u53d6\u6d88\u4efb\u52a1: {name or '\u533f\u540d\u4efb\u52a1'}\")\n            \n            tasks.clear()\n            return cancelled\n        \n        async def wait_all():\n            \"\"\"\u7b49\u5f85\u6240\u6709\u4efb\u52a1\u5b8c\u6210\"\"\"\n            if tasks:\n                print(f\"  \u7b49\u5f85 {len(tasks)} \u4e2a\u4efb\u52a1\u5b8c\u6210...\")\n                await asyncio.gather(*[t for _, t in tasks], return_exceptions=True)\n        \n        def task_count():\n            return len(tasks)\n        \n        return add_task, cancel_all, wait_all, task_count\n    \n    async def demo_task_manager():\n        \"\"\"\u6f14\u793a\u4efb\u52a1\u7ba1\u7406\u5668\"\"\"\n        add_task, cancel_all, wait_all, task_count = create_task_manager()\n        \n        async def worker(name, duration):\n            \"\"\"\u5de5\u4f5c\u51fd\u6570\"\"\"\n            print(f\"    \u4efb\u52a1 {name} \u5f00\u59cb\")\n            await asyncio.sleep(duration)\n            print(f\"    \u4efb\u52a1 {name} \u5b8c\u6210\")\n            return f\"\u4efb\u52a1 {name} \u7ed3\u679c\"\n        \n        <em># \u6dfb\u52a0\u4efb\u52a1<\/em>\n        await add_task(worker(\"A\", 0.2), \"\u4efb\u52a1A\")\n        await add_task(worker(\"B\", 0.1), \"\u4efb\u52a1B\")\n        await add_task(worker(\"C\", 0.3), \"\u4efb\u52a1C\")\n        \n        print(f\"  \u5f53\u524d\u4efb\u52a1\u6570: {task_count()}\")\n        \n        <em># \u7b49\u5f85\u4efb\u52a1\u5b8c\u6210<\/em>\n        await asyncio.sleep(0.15)\n        \n        <em># \u53d6\u6d88\u5269\u4f59\u4efb\u52a1<\/em>\n        cancelled = await cancel_all()\n        print(f\"  \u5df2\u53d6\u6d88 {cancelled} \u4e2a\u4efb\u52a1\")\n        \n        <em># \u6dfb\u52a0\u65b0\u4efb\u52a1<\/em>\n        await add_task(worker(\"D\", 0.1), \"\u4efb\u52a1D\")\n        await wait_all()\n    \n    asyncio.run(demo_task_manager())\n    \n    <em># 3. \u95ed\u5305\u4e0e\u5f02\u6b65\u751f\u6210\u5668<\/em>\n    print(\"\\n3. \u95ed\u5305\u4e0e\u5f02\u6b65\u751f\u6210\u5668\uff1a\")\n    \n    def create_async_data_stream(limit=10, delay=0.1):\n        \"\"\"\u521b\u5efa\u5f02\u6b65\u6570\u636e\u6d41\"\"\"\n        count = 0\n        \n        async def data_stream():\n            nonlocal count\n            while count &lt; limit:\n                await asyncio.sleep(delay)\n                count += 1\n                yield f\"\u6570\u636e\u9879 {count}\"\n        \n        async def reset():\n            nonlocal count\n            count = 0\n            print(\"  \u6570\u636e\u6d41\u5df2\u91cd\u7f6e\")\n        \n        def get_count():\n            return count\n        \n        return data_stream, reset, get_count\n    \n    async def demo_async_stream():\n        \"\"\"\u6f14\u793a\u5f02\u6b65\u6570\u636e\u6d41\"\"\"\n        stream, reset, get_count = create_async_data_stream(limit=5, delay=0.05)\n        \n        print(\"  \u6d88\u8d39\u6570\u636e\u6d41:\")\n        async for data in stream():\n            print(f\"    \u6536\u5230: {data}\")\n        \n        print(f\"  \u603b\u6570\u636e\u9879: {get_count()}\")\n        \n        <em># \u91cd\u7f6e\u5e76\u518d\u6b21\u6d88\u8d39<\/em>\n        await reset()\n        print(\"  \u518d\u6b21\u6d88\u8d39:\")\n        async for data in stream():\n            print(f\"    \u6536\u5230: {data}\")\n    \n    asyncio.run(demo_async_stream())\n    \n    <em># 4. \u5f02\u6b65\u901f\u7387\u9650\u5236<\/em>\n    print(\"\\n4. \u5f02\u6b65\u901f\u7387\u9650\u5236\uff1a\")\n    \n    def create_rate_limiter(max_calls, period):\n        \"\"\"\u521b\u5efa\u901f\u7387\u9650\u5236\u5668\"\"\"\n        import time\n        calls = []\n        \n        async def call_async(func, *args, **kwargs):\n            \"\"\"\u8c03\u7528\u51fd\u6570\uff0c\u9075\u5b88\u901f\u7387\u9650\u5236\"\"\"\n            now = time.time()\n            \n            <em># \u79fb\u9664\u8d85\u8fc7\u65f6\u95f4\u7a97\u53e3\u7684\u8c03\u7528\u8bb0\u5f55<\/em>\n            calls[:] = [t for t in calls if now - t &lt; period]\n            \n            <em># \u68c0\u67e5\u662f\u5426\u8d85\u8fc7\u9650\u5236<\/em>\n            if len(calls) &gt;= max_calls:\n                <em># \u7b49\u5f85\u76f4\u5230\u6709\u53ef\u7528\u914d\u989d<\/em>\n                oldest = calls[0]\n                wait_time = period - (now - oldest)\n                if wait_time &gt; 0:\n                    print(f\"  \u901f\u7387\u9650\u5236: \u7b49\u5f85 {wait_time:.2f}\u79d2\")\n                    await asyncio.sleep(wait_time)\n                    now = time.time()\n                    <em># \u91cd\u65b0\u6e05\u7406\u8c03\u7528\u8bb0\u5f55<\/em>\n                    calls[:] = [t for t in calls if now - t &lt; period]\n            \n            <em># \u8bb0\u5f55\u672c\u6b21\u8c03\u7528<\/em>\n            calls.append(now)\n            \n            <em># \u6267\u884c\u51fd\u6570<\/em>\n            if asyncio.iscoroutinefunction(func):\n                return await func(*args, **kwargs)\n            else:\n                return func(*args, **kwargs)\n        \n        return call_async\n    \n    async def demo_rate_limiter():\n        \"\"\"\u6f14\u793a\u901f\u7387\u9650\u5236\"\"\"\n        limiter = create_rate_limiter(max_calls=3, period=1.0)  <em># \u6bcf\u79d2\u6700\u591a3\u6b21\u8c03\u7528<\/em>\n        \n        async def api_call(i):\n            print(f\"    \u6267\u884cAPI\u8c03\u7528 {i}\")\n            await asyncio.sleep(0.1)\n            return f\"\u7ed3\u679c {i}\"\n        \n        print(\"  \u5feb\u901f\u8c03\u75285\u6b21API\uff08\u5e94\u8be5\u88ab\u9650\u901f\uff09:\")\n        tasks = [limiter(api_call, i) for i in range(5)]\n        results = await asyncio.gather(*tasks)\n        \n        print(f\"  \u6240\u6709\u7ed3\u679c: {results}\")\n    \n    asyncio.run(demo_rate_limiter())\n    \n    <em># 5. \u5f02\u6b65\u7f13\u5b58<\/em>\n    print(\"\\n5. \u5f02\u6b65\u7f13\u5b58\uff1a\")\n    \n    def create_async_cache(ttl=60):\n        \"\"\"\u521b\u5efa\u5f02\u6b65\u7f13\u5b58\"\"\"\n        import time\n        cache = {}\n        \n        async def get_or_set(key, coro_func, *args, **kwargs):\n            \"\"\"\u83b7\u53d6\u6216\u8bbe\u7f6e\u7f13\u5b58\u503c\"\"\"\n            now = time.time()\n            \n            <em># \u68c0\u67e5\u7f13\u5b58<\/em>\n            if key in cache:\n                value, timestamp = cache[key]\n                if now - timestamp &lt; ttl:\n                    print(f\"  \u7f13\u5b58\u547d\u4e2d: {key}\")\n                    return value\n            \n            <em># \u7f13\u5b58\u672a\u547d\u4e2d\uff0c\u6267\u884c\u51fd\u6570<\/em>\n            print(f\"  \u7f13\u5b58\u672a\u547d\u4e2d: {key}\uff0c\u6267\u884c\u51fd\u6570...\")\n            value = await coro_func(*args, **kwargs)\n            \n            <em># \u66f4\u65b0\u7f13\u5b58<\/em>\n            cache[key] = (value, now)\n            print(f\"  \u7f13\u5b58\u5df2\u66f4\u65b0: {key}\")\n            \n            <em># \u6e05\u7406\u8fc7\u671f\u7f13\u5b58<\/em>\n            expired_keys = [k for k, (_, t) in cache.items() if now - t &gt;= ttl]\n            for k in expired_keys:\n                del cache[k]\n            if expired_keys:\n                print(f\"  \u6e05\u7406 {len(expired_keys)} \u4e2a\u8fc7\u671f\u7f13\u5b58\")\n            \n            return value\n        \n        def clear():\n            \"\"\"\u6e05\u7a7a\u7f13\u5b58\"\"\"\n            nonlocal cache\n            count = len(cache)\n            cache = {}\n            print(f\"  \u6e05\u7a7a {count} \u4e2a\u7f13\u5b58\u9879\")\n            return count\n        \n        def size():\n            return len(cache)\n        \n        return get_or_set, clear, size\n    \n    async def demo_async_cache():\n        \"\"\"\u6f14\u793a\u5f02\u6b65\u7f13\u5b58\"\"\"\n        get_or_set, clear, size = create_async_cache(ttl=0.5)  <em># 0.5\u79d2TTL<\/em>\n        \n        async def expensive_operation(key):\n            print(f\"    \u6267\u884c\u6602\u8d35\u64cd\u4f5c: {key}\")\n            await asyncio.sleep(0.2)\n            return f\"\u64cd\u4f5c\u7ed3\u679c {key}\"\n        \n        print(\"  \u7b2c\u4e00\u6b21\u8c03\u7528\uff08\u7f13\u5b58\u672a\u547d\u4e2d\uff09:\")\n        result1 = await get_or_set(\"key1\", expensive_operation, \"key1\")\n        print(f\"    \u7ed3\u679c: {result1}\")\n        \n        print(\"\\n  \u7acb\u5373\u518d\u6b21\u8c03\u7528\uff08\u7f13\u5b58\u547d\u4e2d\uff09:\")\n        result2 = await get_or_set(\"key1\", expensive_operation, \"key1\")\n        print(f\"    \u7ed3\u679c: {result2}\")\n        \n        print(f\"\\n  \u7f13\u5b58\u5927\u5c0f: {size()}\")\n        \n        print(\"\\n  \u7b49\u5f85\u7f13\u5b58\u8fc7\u671f...\")\n        await asyncio.sleep(0.6)\n        \n        print(\"  \u8fc7\u671f\u540e\u8c03\u7528\uff08\u7f13\u5b58\u672a\u547d\u4e2d\uff09:\")\n        result3 = await get_or_set(\"key1\", expensive_operation, \"key1\")\n        print(f\"    \u7ed3\u679c: {result3}\")\n        \n        print(f\"\\n  \u6e05\u7a7a\u7f13\u5b58:\")\n        cleared = clear()\n        print(f\"    \u6e05\u7406\u4e86 {cleared} \u4e2a\u7f13\u5b58\u9879\")\n        print(f\"    \u7f13\u5b58\u5927\u5c0f: {size()}\")\n    \n    asyncio.run(demo_async_cache())\n\n<em># \u8fd0\u884c\u6f14\u793a<\/em>\ndemonstrate_async_closures()<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">2.2 \u95ed\u5305\u4e0e\u51fd\u6570\u5f0f\u7f16\u7a0b<\/h3>\n\n\n\n<p>\u95ed\u5305\u662f\u51fd\u6570\u5f0f\u7f16\u7a0b\u7684\u6838\u5fc3\u6982\u5ff5\uff0c\u652f\u6301\u9ad8\u9636\u51fd\u6570\u3001\u67ef\u91cc\u5316\u3001\u7ec4\u5408\u7b49\u6a21\u5f0f\u3002<\/p>\n\n\n\n<p>python<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><em># ============================================================================<\/em>\n<em># \u95ed\u5305\u4e0e\u51fd\u6570\u5f0f\u7f16\u7a0b<\/em>\n<em># ============================================================================<\/em>\n\nprint(\"\\n=== \u95ed\u5305\u4e0e\u51fd\u6570\u5f0f\u7f16\u7a0b ===\")\n\ndef demonstrate_functional_closures():\n    \"\"\"\u6f14\u793a\u95ed\u5305\u4e0e\u51fd\u6570\u5f0f\u7f16\u7a0b\"\"\"\n    \n    import functools\n    from typing import Callable, TypeVar, Any\n    \n    T = TypeVar('T')\n    U = TypeVar('U')\n    V = TypeVar('V')\n    \n    <em># 1. \u9ad8\u9636\u51fd\u6570<\/em>\n    print(\"1. \u9ad8\u9636\u51fd\u6570\uff1a\")\n    \n    def compose(*funcs: Callable) -&gt; Callable:\n        \"\"\"\u51fd\u6570\u7ec4\u5408\uff1af(g(x))\"\"\"\n        def composed(arg):\n            result = arg\n            for f in reversed(funcs):\n                result = f(result)\n            return result\n        return composed\n    \n    def pipe(*funcs: Callable) -&gt; Callable:\n        \"\"\"\u7ba1\u9053\u64cd\u4f5c\uff1ax |&gt; f |&gt; g\"\"\"\n        def piped(arg):\n            result = arg\n            for f in funcs:\n                result = f(result)\n            return result\n        return piped\n    \n    <em># \u793a\u4f8b\u51fd\u6570<\/em>\n    def add_one(x: int) -&gt; int:\n        return x + 1\n    \n    def double(x: int) -&gt; int:\n        return x * 2\n    \n    def square(x: int) -&gt; int:\n        return x * x\n    \n    <em># \u7ec4\u5408\u51fd\u6570<\/em>\n    add_one_then_double = compose(double, add_one)\n    double_then_add_one = compose(add_one, double)\n    \n    print(f\"  \u7ec4\u5408\u51fd\u6570\u793a\u4f8b:\")\n    print(f\"  add_one_then_double(5) = {add_one_then_double(5)}\")  <em># double(add_one(5)) = 12<\/em>\n    print(f\"  double_then_add_one(5) = {double_then_add_one(5)}\")  <em># add_one(double(5)) = 11<\/em>\n    \n    <em># \u7ba1\u9053\u64cd\u4f5c<\/em>\n    pipeline = pipe(add_one, double, square)\n    print(f\"  \u7ba1\u9053\u64cd\u4f5c: 5 |&gt; add_one |&gt; double |&gt; square = {pipeline(5)}\")  <em># 144<\/em>\n    \n    <em># 2. \u67ef\u91cc\u5316\u4e0e\u90e8\u5206\u5e94\u7528<\/em>\n    print(\"\\n2. \u67ef\u91cc\u5316\u4e0e\u90e8\u5206\u5e94\u7528\uff1a\")\n    \n    def curry2(func: Callable[[T, U], V]) -&gt; Callable[[T], Callable[[U], V]]:\n        \"\"\"\u4e8c\u5143\u51fd\u6570\u67ef\u91cc\u5316\"\"\"\n        return lambda x: lambda y: func(x, y)\n    \n    def uncurry2(func: Callable[[T], Callable[[U], V]]) -&gt; Callable[[T, U], V]:\n        \"\"\"\u4e8c\u5143\u51fd\u6570\u53cd\u67ef\u91cc\u5316\"\"\"\n        return lambda x, y: func(x)(y)\n    \n    <em># \u539f\u59cb\u51fd\u6570<\/em>\n    def add(x: int, y: int) -&gt; int:\n        return x + y\n    \n    def multiply(x: int, y: int) -&gt; int:\n        return x * y\n    \n    <em># \u67ef\u91cc\u5316<\/em>\n    curried_add = curry2(add)\n    curried_multiply = curry2(multiply)\n    \n    print(f\"  \u67ef\u91cc\u5316\u793a\u4f8b:\")\n    print(f\"  curried_add(3)(5) = {curried_add(3)(5)}\")\n    print(f\"  curried_multiply(3)(5) = {curried_multiply(3)(5)}\")\n    \n    <em># \u90e8\u5206\u5e94\u7528<\/em>\n    add_five = curried_add(5)\n    multiply_by_three = curried_multiply(3)\n    \n    print(f\"  \u90e8\u5206\u5e94\u7528\u793a\u4f8b:\")\n    print(f\"  add_five(10) = {add_five(10)}\")\n    print(f\"  multiply_by_three(10) = {multiply_by_three(10)}\")\n    \n    <em># \u53cd\u67ef\u91cc\u5316<\/em>\n    uncurried_add = uncurry2(curried_add)\n    print(f\"  \u53cd\u67ef\u91cc\u5316: uncurried_add(3, 5) = {uncurried_add(3, 5)}\")\n    \n    <em># 3. \u95ed\u5305\u4e0e\u51fd\u6570\u5de5\u5382<\/em>\n    print(\"\\n3. \u95ed\u5305\u4e0e\u51fd\u6570\u5de5\u5382\uff1a\")\n    \n    def function_factory(operation: str) -&gt; Callable[[float, float], float]:\n        \"\"\"\u51fd\u6570\u5de5\u5382\uff1a\u6839\u636e\u64cd\u4f5c\u7b26\u521b\u5efa\u51fd\u6570\"\"\"\n        operations = {\n            '+': lambda x, y: x + y,\n            '-': lambda x, y: x - y,\n            '*': lambda x, y: x * y,\n            '\/': lambda x, y: x \/ y if y != 0 else float('nan'),\n        }\n        \n        if operation not in operations:\n            raise ValueError(f\"\u672a\u77e5\u64cd\u4f5c\u7b26: {operation}\")\n        \n        return operations[operation]\n    \n    <em># \u521b\u5efa\u51fd\u6570<\/em>\n    add_func = function_factory('+')\n    multiply_func = function_factory('*')\n    \n    print(f\"  \u51fd\u6570\u5de5\u5382\u793a\u4f8b:\")\n    print(f\"  add_func(10, 5) = {add_func(10, 5)}\")\n    print(f\"  multiply_func(10, 5) = {multiply_func(10, 5)}\")\n    \n    <em># \u66f4\u590d\u6742\u7684\u51fd\u6570\u5de5\u5382<\/em>\n    def make_transformer(scale: float, offset: float) -&gt; Callable[[float], float]:\n        \"\"\"\u521b\u5efa\u7ebf\u6027\u53d8\u6362\u51fd\u6570\"\"\"\n        def transform(x: float) -&gt; float:\n            return scale * x + offset\n        return transform\n    \n    celsius_to_fahrenheit = make_transformer(1.8, 32)\n    meters_to_feet = make_transformer(3.28084, 0)\n    \n    print(f\"\\n  \u53d8\u6362\u51fd\u6570\u5de5\u5382:\")\n    print(f\"  20\u00b0C = {celsius_to_fahrenheit(20):.1f}\u00b0F\")\n    print(f\"  10m = {meters_to_feet(10):.2f}ft\")\n    \n    <em># 4. \u95ed\u5305\u4e0e\u51fd\u6570\u8bb0\u5fc6\u5316<\/em>\n    print(\"\\n4. \u95ed\u5305\u4e0e\u51fd\u6570\u8bb0\u5fc6\u5316\uff1a\")\n    \n    def memoize_with_key(func: Callable[..., T], key_func: Callable[..., Any] = None) -&gt; Callable[..., T]:\n        \"\"\"\u5e26\u81ea\u5b9a\u4e49\u952e\u51fd\u6570\u7684\u8bb0\u5fc6\u5316\"\"\"\n        cache = {}\n        \n        def memoized(*args, **kwargs):\n            <em># \u4f7f\u7528\u63d0\u4f9b\u7684\u952e\u51fd\u6570\u6216\u9ed8\u8ba4\u53c2\u6570\u5143\u7ec4\u4f5c\u4e3a\u952e<\/em>\n            if key_func:\n                key = key_func(*args, **kwargs)\n            else:\n                key = (args, tuple(sorted(kwargs.items())))\n            \n            if key not in cache:\n                cache[key] = func(*args, **kwargs)\n            return cache[key]\n        \n        return memoized\n    \n    <em># \u793a\u4f8b\uff1a\u6590\u6ce2\u90a3\u5951\u6570\u5217<\/em>\n    @memoize_with_key\n    def fibonacci(n: int) -&gt; int:\n        if n &lt;= 1:\n            return n\n        return fibonacci(n-1) + fibonacci(n-2)\n    \n    print(f\"  \u8bb0\u5fc6\u5316\u6590\u6ce2\u90a3\u5951:\")\n    print(f\"  fibonacci(10) = {fibonacci(10)}\")\n    print(f\"  fibonacci(20) = {fibonacci(20)}\")\n    \n    <em># 5. \u95ed\u5305\u4e0e\u60f0\u6027\u5e8f\u5217<\/em>\n    print(\"\\n5. \u95ed\u5305\u4e0e\u60f0\u6027\u5e8f\u5217\uff1a\")\n    \n    def lazy_range(start: int, end: int = None, step: int = 1):\n        \"\"\"\u521b\u5efa\u60f0\u6027\u8303\u56f4\"\"\"\n        if end is None:\n            start, end = 0, start\n        \n        current = start\n        \n        def next_value():\n            nonlocal current\n            if (step &gt; 0 and current &gt;= end) or (step &lt; 0 and current &lt;= end):\n                raise StopIteration\n            \n            value = current\n            current += step\n            return value\n        \n        def has_next():\n            if step &gt; 0:\n                return current &lt; end\n            else:\n                return current &gt; end\n        \n        def reset():\n            nonlocal current\n            current = start\n        \n        def take(n: int):\n            \"\"\"\u83b7\u53d6\u524dn\u4e2a\u503c\"\"\"\n            values = []\n            for _ in range(n):\n                if has_next():\n                    values.append(next_value())\n                else:\n                    break\n            return values\n        \n        return {\n            'next': next_value,\n            'has_next': has_next,\n            'reset': reset,\n            'take': take,\n        }\n    \n    print(\"  \u60f0\u6027\u5e8f\u5217\u793a\u4f8b:\")\n    seq = lazy_range(1, 10)\n    \n    print(f\"  \u524d3\u4e2a\u503c: {seq['take'](3)}\")\n    print(f\"  \u518d\u53d62\u4e2a\u503c: {[seq['next']() for _ in range(2)]}\")\n    print(f\"  \u662f\u5426\u8fd8\u6709\u503c: {seq['has_next']()}\")\n    \n    seq['reset']()\n    print(f\"  \u91cd\u7f6e\u540e\u524d5\u4e2a\u503c: {seq['take'](5)}\")\n    \n    <em># 6. \u95ed\u5305\u4e0e\u72b6\u6001\u7ba1\u7406\uff08\u51fd\u6570\u5f0f\u72b6\u6001\uff09<\/em>\n    print(\"\\n6. \u95ed\u5305\u4e0e\u72b6\u6001\u7ba1\u7406\uff1a\")\n    \n    def create_stateful_component(initial_state):\n        \"\"\"\u521b\u5efa\u6709\u72b6\u6001\u7684\u7ec4\u4ef6\uff08\u51fd\u6570\u5f0f\u98ce\u683c\uff09\"\"\"\n        state = initial_state\n        \n        def get_state():\n            return state\n        \n        def update_state(updater):\n            nonlocal state\n            state = updater(state)\n            return state\n        \n        def map_state(mapper):\n            nonlocal state\n            state = mapper(state)\n            return state\n        \n        def with_state(worker):\n            \"\"\"\u5728\u5f53\u524d\u72b6\u6001\u4e0b\u6267\u884c\u5de5\u4f5c\"\"\"\n            return worker(state)\n        \n        return {\n            'get_state': get_state,\n            'update_state': update_state,\n            'map_state': map_state,\n            'with_state': with_state,\n        }\n    \n    print(\"  \u51fd\u6570\u5f0f\u72b6\u6001\u7ba1\u7406:\")\n    counter = create_stateful_component(0)\n    \n    print(f\"  \u521d\u59cb\u72b6\u6001: {counter['get_state']()}\")\n    \n    <em># \u66f4\u65b0\u72b6\u6001<\/em>\n    counter['update_state'](lambda s: s + 1)\n    print(f\"  \u52a01\u540e: {counter['get_state']()}\")\n    \n    counter['map_state'](lambda s: s * 2)\n    print(f\"  \u4e582\u540e: {counter['get_state']()}\")\n    \n    <em># \u4f7f\u7528\u72b6\u6001\u4f46\u4e0d\u4fee\u6539<\/em>\n    result = counter['with_state'](lambda s: f\"\u5f53\u524d\u503c: {s}\")\n    print(f\"  \u8bfb\u53d6\u72b6\u6001: {result}\")\n    \n    <em># 7. \u95ed\u5305\u4e0e\u5355\u5b50\uff08Monad\uff09\u6a21\u5f0f<\/em>\n    print(\"\\n7. \u95ed\u5305\u4e0e\u5355\u5b50\u6a21\u5f0f\uff1a\")\n    \n    class Maybe:\n        \"\"\"Maybe\u5355\u5b50\uff08\u7c7b\u4f3cOption\uff09\"\"\"\n        \n        @staticmethod\n        def unit(value):\n            \"\"\"unit\/return\u64cd\u4f5c\"\"\"\n            return Just(value)\n        \n        @staticmethod\n        def bind(mvalue, func):\n            \"\"\"bind\u64cd\u4f5c\uff08&gt;&gt;=\uff09\"\"\"\n            if isinstance(mvalue, Just):\n                return func(mvalue.value)\n            else:  <em># Nothing<\/em>\n                return mvalue\n        \n        @staticmethod\n        def fmap(func, mvalue):\n            \"\"\"fmap\u64cd\u4f5c\uff08f &lt;$&gt; m\uff09\"\"\"\n            if isinstance(mvalue, Just):\n                return Just(func(mvalue.value))\n            else:\n                return mvalue\n    \n    class Just(Maybe):\n        \"\"\"\u6709\u503c\"\"\"\n        def __init__(self, value):\n            self.value = value\n        \n        def __str__(self):\n            return f\"Just({self.value})\"\n    \n    class Nothing(Maybe):\n        \"\"\"\u65e0\u503c\"\"\"\n        def __str__(self):\n            return \"Nothing\"\n    \n    <em># \u4f7f\u7528Maybe\u5904\u7406\u53ef\u80fd\u5931\u8d25\u7684\u8ba1\u7b97<\/em>\n    def safe_divide(x, y):\n        \"\"\"\u5b89\u5168\u9664\u6cd5\"\"\"\n        if y == 0:\n            return Nothing()\n        return Just(x \/ y)\n    \n    def safe_sqrt(x):\n        \"\"\"\u5b89\u5168\u5e73\u65b9\u6839\"\"\"\n        if x &lt; 0:\n            return Nothing()\n        return Just(x ** 0.5)\n    \n    <em># \u94fe\u5f0f\u64cd\u4f5c<\/em>\n    result1 = Maybe.bind(\n        safe_divide(16, 4),\n        lambda x: safe_sqrt(x)\n    )\n    \n    result2 = Maybe.bind(\n        safe_divide(16, 0),  <em># \u9664\u4ee50<\/em>\n        lambda x: safe_sqrt(x)\n    )\n    \n    result3 = Maybe.bind(\n        safe_divide(-16, 4),  <em># \u7ed3\u679c\u4e3a\u8d1f<\/em>\n        lambda x: safe_sqrt(x)\n    )\n    \n    print(\"  Maybe\u5355\u5b50\u793a\u4f8b:\")\n    print(f\"  16 \/ 4 |&gt; sqrt = {result1}\")\n    print(f\"  16 \/ 0 |&gt; sqrt = {result2}\")\n    print(f\"  -16 \/ 4 |&gt; sqrt = {result3}\")\n    \n    <em># \u4f7f\u7528\u95ed\u5305\u7b80\u5316<\/em>\n    def maybe_computation(*steps):\n        \"\"\"\u7ec4\u5408\u591a\u4e2a\u53ef\u80fd\u5931\u8d25\u7684\u8ba1\u7b97\"\"\"\n        def run(initial_value):\n            result = Maybe.unit(initial_value)\n            for step in steps:\n                result = Maybe.bind(result, step)\n            return result\n        return run\n    \n    <em># \u521b\u5efa\u8ba1\u7b97\u7ba1\u9053<\/em>\n    compute = maybe_computation(\n        lambda x: safe_divide(x, 2),\n        lambda x: safe_sqrt(x),\n        lambda x: Just(x * 10)  <em># \u603b\u662f\u6210\u529f<\/em>\n    )\n    \n    print(f\"\\n  \u8ba1\u7b97\u7ba1\u9053\u793a\u4f8b:\")\n    print(f\"  \u8ba1\u7b97 100: {compute(100)}\")\n    print(f\"  \u8ba1\u7b97 -100: {compute(-100)}\")\n\n<em># \u8fd0\u884c\u6f14\u793a<\/em>\ndemonstrate_functional_closures()<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u7b2c\u4e09\u90e8\u5206\uff1a\u95ed\u5305\u7684\u8bbe\u8ba1\u54f2\u5b66\u4e0e\u6700\u4f73\u5b9e\u8df5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">3.1 \u95ed\u5305\u7684\u8bbe\u8ba1\u54f2\u5b66<\/h3>\n\n\n\n<p>\u95ed\u5305\u4e0d\u4ec5\u4ec5\u662f\u6280\u672f\u7279\u6027\uff0c\u5b83\u8fd8\u4ee3\u8868\u4e86\u4e00\u79cd\u7f16\u7a0b\u54f2\u5b66\u3002<\/p>\n\n\n\n<p>python<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><em># ============================================================================<\/em>\n<em># \u95ed\u5305\u7684\u8bbe\u8ba1\u54f2\u5b66<\/em>\n<em># ============================================================================<\/em>\n\nprint(\"\\n=== \u95ed\u5305\u7684\u8bbe\u8ba1\u54f2\u5b66 ===\")\n\ndef demonstrate_closure_philosophy():\n    \"\"\"\u6f14\u793a\u95ed\u5305\u7684\u8bbe\u8ba1\u54f2\u5b66\"\"\"\n    \n    print(\"\u95ed\u5305\u80cc\u540e\u7684\u8f6f\u4ef6\u8bbe\u8ba1\u54f2\u5b66\uff1a\")\n    \n    <em># 1. \u6700\u5c0f\u6743\u9650\u539f\u5219<\/em>\n    print(\"\\n1. \u6700\u5c0f\u6743\u9650\u539f\u5219\uff1a\")\n    print(\"   \u95ed\u5305\u53ea\u66b4\u9732\u5fc5\u8981\u7684\u63a5\u53e3\uff0c\u9690\u85cf\u5b9e\u73b0\u7ec6\u8282\")\n    \n    def create_bank_account(initial_balance=0):\n        \"\"\"\u521b\u5efa\u94f6\u884c\u8d26\u6237\"\"\"\n        balance = initial_balance\n        transaction_history = []\n        \n        def deposit(amount):\n            nonlocal balance\n            if amount &lt;= 0:\n                return False\n            balance += amount\n            transaction_history.append(('deposit', amount, balance))\n            return True\n        \n        def withdraw(amount):\n            nonlocal balance\n            if amount &lt;= 0 or amount &gt; balance:\n                return False\n            balance -= amount\n            transaction_history.append(('withdraw', amount, balance))\n            return True\n        \n        def get_balance():\n            return balance\n        \n        def get_transaction_count():\n            return len(transaction_history)\n        \n        <em># \u4e0d\u66b4\u9732transaction_history\uff0c\u53ea\u63d0\u4f9b\u7edf\u8ba1\u4fe1\u606f<\/em>\n        return {\n            'deposit': deposit,\n            'withdraw': withdraw,\n            'get_balance': get_balance,\n            'get_transaction_count': get_transaction_count,\n        }\n    \n    account = create_bank_account(100)\n    print(f\"   \u521d\u59cb\u4f59\u989d: ${account['get_balance']()}\")\n    account['deposit'](50)\n    account['withdraw'](30)\n    print(f\"   \u64cd\u4f5c\u540e\u4f59\u989d: ${account['get_balance']()}\")\n    print(f\"   \u4ea4\u6613\u6b21\u6570: {account['get_transaction_count']()}\")\n    print(f\"   \u65e0\u6cd5\u76f4\u63a5\u8bbf\u95ee\u4ea4\u6613\u5386\u53f2\uff08\u6700\u5c0f\u6743\u9650\uff09\")\n    \n    <em># 2. \u7ec4\u5408\u4f18\u4e8e\u7ee7\u627f<\/em>\n    print(\"\\n2. \u7ec4\u5408\u4f18\u4e8e\u7ee7\u627f\uff1a\")\n    print(\"   \u4f7f\u7528\u95ed\u5305\u7ec4\u5408\u529f\u80fd\uff0c\u800c\u4e0d\u662f\u901a\u8fc7\u7ee7\u627f\")\n    \n    def create_loggable(func, logger_func):\n        \"\"\"\u521b\u5efa\u53ef\u8bb0\u5f55\u65e5\u5fd7\u7684\u51fd\u6570\"\"\"\n        def logged(*args, **kwargs):\n            logger_func(f\"\u8c03\u7528 {func.__name__}\uff0c\u53c2\u6570: {args}, {kwargs}\")\n            result = func(*args, **kwargs)\n            logger_func(f\"{func.__name__} \u8fd4\u56de: {result}\")\n            return result\n        return logged\n    \n    def create_timed(func):\n        \"\"\"\u521b\u5efa\u8ba1\u65f6\u51fd\u6570\"\"\"\n        import time\n        def timed(*args, **kwargs):\n            start = time.time()\n            result = func(*args, **kwargs)\n            end = time.time()\n            print(f\"  {func.__name__} \u6267\u884c\u65f6\u95f4: {end - start:.6f}\u79d2\")\n            return result\n        return timed\n    \n    def create_retryable(func, max_retries=3):\n        \"\"\"\u521b\u5efa\u53ef\u91cd\u8bd5\u7684\u51fd\u6570\"\"\"\n        def retryable(*args, **kwargs):\n            last_exception = None\n            for attempt in range(max_retries):\n                try:\n                    if attempt &gt; 0:\n                        print(f\"  \u7b2c {attempt} \u6b21\u91cd\u8bd5...\")\n                    return func(*args, **kwargs)\n                except Exception as e:\n                    last_exception = e\n                    print(f\"  \u7b2c {attempt+1} \u6b21\u5c1d\u8bd5\u5931\u8d25: {e}\")\n            \n            print(f\"  \u6240\u6709 {max_retries} \u6b21\u5c1d\u8bd5\u90fd\u5931\u8d25\")\n            raise last_exception\n        return retryable\n    \n    <em># \u539f\u59cb\u51fd\u6570<\/em>\n    def unstable_operation():\n        import random\n        if random.random() &lt; 0.5:\n            raise ValueError(\"\u968f\u673a\u5931\u8d25\")\n        return \"\u6210\u529f\"\n    \n    <em># \u7ec4\u5408\u529f\u80fd<\/em>\n    logged_operation = create_loggable(unstable_operation, print)\n    timed_operation = create_timed(logged_operation)\n    robust_operation = create_retryable(timed_operation, max_retries=5)\n    \n    print(\"   \u7ec4\u5408\u529f\u80fd\u793a\u4f8b:\")\n    try:\n        result = robust_operation()\n        print(f\"   \u7ed3\u679c: {result}\")\n    except Exception as e:\n        print(f\"   \u6700\u7ec8\u5931\u8d25: {e}\")\n    \n    <em># 3. \u51fd\u6570\u4f5c\u4e3a\u4e00\u7b49\u516c\u6c11<\/em>\n    print(\"\\n3. \u51fd\u6570\u4f5c\u4e3a\u4e00\u7b49\u516c\u6c11\uff1a\")\n    print(\"   \u51fd\u6570\u53ef\u4ee5\u50cf\u5176\u4ed6\u503c\u4e00\u6837\u4f20\u9012\u3001\u8fd4\u56de\u548c\u5b58\u50a8\")\n    \n    def create_calculator():\n        \"\"\"\u521b\u5efa\u8ba1\u7b97\u5668\"\"\"\n        operations = {}\n        \n        def register(name, func):\n            operations[name] = func\n            print(f\"  \u6ce8\u518c\u64cd\u4f5c: {name}\")\n        \n        def execute(name, *args):\n            if name in operations:\n                return operations[name](*args)\n            else:\n                raise ValueError(f\"\u672a\u77e5\u64cd\u4f5c: {name}\")\n        \n        def list_operations():\n            return list(operations.keys())\n        \n        return register, execute, list_operations\n    \n    register, execute, list_ops = create_calculator()\n    \n    <em># \u6ce8\u518c\u64cd\u4f5c<\/em>\n    register('add', lambda x, y: x + y)\n    register('multiply', lambda x, y: x * y)\n    register('power', lambda x, y: x ** y)\n    \n    print(f\"   \u53ef\u7528\u64cd\u4f5c: {list_ops()}\")\n    print(f\"   \u6267\u884c add(3, 5): {execute('add', 3, 5)}\")\n    print(f\"   \u6267\u884c multiply(3, 5): {execute('multiply', 3, 5)}\")\n    \n    <em># 4. \u5173\u6ce8\u70b9\u5206\u79bb<\/em>\n    print(\"\\n4. \u5173\u6ce8\u70b9\u5206\u79bb\uff1a\")\n    print(\"   \u4f7f\u7528\u95ed\u5305\u5206\u79bb\u6570\u636e\u3001\u903b\u8f91\u548c\u526f\u4f5c\u7528\")\n    \n    def create_data_pipeline(*processors):\n        \"\"\"\u521b\u5efa\u6570\u636e\u5904\u7406\u7ba1\u9053\"\"\"\n        def process(data):\n            result = data\n            for processor in processors:\n                result = processor(result)\n            return result\n        return process\n    \n    <em># \u5404\u79cd\u5904\u7406\u5668<\/em>\n    def validate_data(data):\n        if not isinstance(data, dict):\n            raise ValueError(\"\u6570\u636e\u5fc5\u987b\u662f\u5b57\u5178\")\n        return data\n    \n    def extract_fields(data):\n        return {k: v for k, v in data.items() if k in ['name', 'age', 'email']}\n    \n    def transform_data(data):\n        data['age'] = int(data.get('age', 0))\n        data['name'] = data.get('name', '').title()\n        return data\n    \n    def log_data(data):\n        print(f\"  \u5904\u7406\u6570\u636e: {data}\")\n        return data\n    \n    <em># \u521b\u5efa\u7ba1\u9053<\/em>\n    data_pipeline = create_data_pipeline(\n        validate_data,\n        extract_fields,\n        transform_data,\n        log_data\n    )\n    \n    raw_data = {'name': 'alice smith', 'age': '30', 'email': 'alice@example.com', 'extra': 'ignore'}\n    print(\"   \u6570\u636e\u5904\u7406\u7ba1\u9053:\")\n    processed_data = data_pipeline(raw_data)\n    print(f\"   \u5904\u7406\u7ed3\u679c: {processed_data}\")\n    \n    <em># 5. \u4e0d\u53ef\u53d8\u6027\u4e0e\u7eaf\u51fd\u6570<\/em>\n    print(\"\\n5. \u4e0d\u53ef\u53d8\u6027\u4e0e\u7eaf\u51fd\u6570\uff1a\")\n    print(\"   \u95ed\u5305\u53ef\u4ee5\u6355\u83b7\u4e0d\u53ef\u53d8\u72b6\u6001\uff0c\u521b\u5efa\u7eaf\u51fd\u6570\")\n    \n    def create_pure_function(base_value):\n        \"\"\"\u521b\u5efa\u7eaf\u51fd\u6570\uff08\u7ed9\u5b9a\u76f8\u540c\u8f93\u5165\uff0c\u603b\u662f\u8fd4\u56de\u76f8\u540c\u8f93\u51fa\uff09\"\"\"\n        def pure_function(x):\n            <em># \u53ea\u4f7f\u7528\u53c2\u6570\u548c\u6355\u83b7\u7684\u4e0d\u53ef\u53d8\u72b6\u6001<\/em>\n            return x + base_value\n        return pure_function\n    \n    add_ten = create_pure_function(10)\n    add_twenty = create_pure_function(20)\n    \n    print(\"   \u7eaf\u51fd\u6570\u793a\u4f8b:\")\n    print(f\"   add_ten(5) = {add_ten(5)} (\u603b\u662f15)\")\n    print(f\"   add_twenty(5) = {add_twenty(5)} (\u603b\u662f25)\")\n    print(f\"   \u6ca1\u6709\u526f\u4f5c\u7528\uff0c\u5bb9\u6613\u6d4b\u8bd5\u548c\u63a8\u7406\")\n    \n    <em># 6. \u5ef6\u8fdf\u8ba1\u7b97\u4e0e\u60f0\u6027\u6c42\u503c<\/em>\n    print(\"\\n6. \u5ef6\u8fdf\u8ba1\u7b97\u4e0e\u60f0\u6027\u6c42\u503c\uff1a\")\n    \n    def create_lazy_evaluator(computation):\n        \"\"\"\u521b\u5efa\u5ef6\u8fdf\u8ba1\u7b97\u5668\"\"\"\n        computed = False\n        value = None\n        \n        def get():\n            nonlocal computed, value\n            if not computed:\n                print(\"    \u6267\u884c\u8ba1\u7b97...\")\n                value = computation()\n                computed = True\n            return value\n        \n        def is_computed():\n            return computed\n        \n        return get, is_computed\n    \n    print(\"   \u5ef6\u8fdf\u8ba1\u7b97\u793a\u4f8b:\")\n    \n    <em># \u6602\u8d35\u7684\u8ba1\u7b97<\/em>\n    expensive_computation = lambda: sum(i**2 for i in range(1000000))\n    \n    lazy_value, is_computed = create_lazy_evaluator(expensive_computation)\n    \n    print(f\"   \u662f\u5426\u5df2\u8ba1\u7b97: {is_computed()}\")\n    print(\"   \u7b2c\u4e00\u6b21\u83b7\u53d6\u503c:\")\n    result1 = lazy_value()\n    print(f\"   \u7ed3\u679c: {result1}, \u662f\u5426\u5df2\u8ba1\u7b97: {is_computed()}\")\n    \n    print(\"   \u7b2c\u4e8c\u6b21\u83b7\u53d6\u503c\uff08\u5e94\u8be5\u7acb\u5373\u8fd4\u56de\uff09:\")\n    result2 = lazy_value()\n    print(f\"   \u7ed3\u679c: {result2}\")\n    \n    <em># 7. \u95ed\u5305\u4e0e\u9886\u57df\u7279\u5b9a\u8bed\u8a00\uff08DSL\uff09<\/em>\n    print(\"\\n7. \u95ed\u5305\u4e0e\u9886\u57df\u7279\u5b9a\u8bed\u8a00\uff1a\")\n    \n    def create_query_dsl():\n        \"\"\"\u521b\u5efa\u67e5\u8be2DSL\"\"\"\n        conditions = []\n        \n        def where(field, op, value):\n            conditions.append((field, op, value))\n            return query\n        \n        def execute(data):\n            result = []\n            for item in data:\n                match = True\n                for field, op, expected in conditions:\n                    actual = item.get(field)\n                    \n                    if op == '==':\n                        if actual != expected:\n                            match = False\n                            break\n                    elif op == '!=':\n                        if actual == expected:\n                            match = False\n                            break\n                    elif op == '&gt;':\n                        if not (actual &gt; expected):\n                            match = False\n                            break\n                    elif op == '&lt;':\n                        if not (actual &lt; expected):\n                            match = False\n                            break\n                    elif op == 'contains':\n                        if expected not in str(actual):\n                            match = False\n                            break\n                \n                if match:\n                    result.append(item)\n            \n            return result\n        \n        def reset():\n            nonlocal conditions\n            conditions = []\n            return query\n        \n        query = {\n            'where': where,\n            'execute': execute,\n            'reset': reset,\n        }\n        return query\n    \n    print(\"   \u67e5\u8be2DSL\u793a\u4f8b:\")\n    \n    <em># \u6d4b\u8bd5\u6570\u636e<\/em>\n    users = [\n        {'name': 'Alice', 'age': 30, 'role': 'admin'},\n        {'name': 'Bob', 'age': 25, 'role': 'user'},\n        {'name': 'Charlie', 'age': 35, 'role': 'admin'},\n        {'name': 'Diana', 'age': 28, 'role': 'user'},\n    ]\n    \n    query = create_query_dsl()\n    \n    <em># \u6784\u5efa\u67e5\u8be2<\/em>\n    results = (query['where']('role', '==', 'admin')\n                   ['where']('age', '&gt;', 28)\n                   ['execute'](users))\n    \n    print(f\"   \u67e5\u8be2\u7ed3\u679c: {[r['name'] for r in results]}\")\n    \n    <em># \u91cd\u7f6e\u5e76\u6784\u5efa\u65b0\u67e5\u8be2<\/em>\n    query['reset']()\n    results2 = (query['where']('name', 'contains', 'a')\n                      ['execute'](users))\n    \n    print(f\"   \u65b0\u67e5\u8be2\u7ed3\u679c: {[r['name'] for r in results2]}\")\n\n<em># \u8fd0\u884c\u6f14\u793a<\/em>\ndemonstrate_closure_philosophy()\n\n<em># \u95ed\u5305\u7684\u6700\u4f73\u5b9e\u8df5<\/em>\nprint(\"\\n\" + \"=\"*60)\nprint(\"\u95ed\u5305\u7684\u6700\u4f73\u5b9e\u8df5\")\nprint(\"=\"*60)\n\nprint(\"\"\"\n\u539f\u52191\uff1a\u660e\u786e\u95ed\u5305\u7684\u7528\u9014\n  \u2022 \u7528\u4e8e\u5c01\u88c5\u72b6\u6001\u548c\u6570\u636e\u9690\u79c1\n  \u2022 \u7528\u4e8e\u521b\u5efa\u51fd\u6570\u5de5\u5382\n  \u2022 \u7528\u4e8e\u5b9e\u73b0\u56de\u8c03\u51fd\u6570\u548c\u4e8b\u4ef6\u5904\u7406\n  \u2022 \u907f\u514d\u8fc7\u5ea6\u4f7f\u7528\u5bfc\u81f4\u4ee3\u7801\u96be\u4ee5\u7406\u89e3\n\n\u539f\u52192\uff1a\u6ce8\u610f\u53d8\u91cf\u7684\u751f\u547d\u5468\u671f\n  \u2022 \u7406\u89e3\u54ea\u4e9b\u53d8\u91cf\u88ab\u95ed\u5305\u6355\u83b7\n  \u2022 \u6ce8\u610f\u5faa\u73af\u5f15\u7528\u53ef\u80fd\u5bfc\u81f4\u7684\u5185\u5b58\u6cc4\u6f0f\n  \u2022 \u5728\u4e0d\u9700\u8981\u65f6\u91ca\u653e\u95ed\u5305\u5f15\u7528\n\n\u539f\u52193\uff1a\u4f7f\u7528\u9002\u5f53\u7684\u5de5\u5177\n  \u2022 \u7b80\u5355\u7684\u72b6\u6001\u5c01\u88c5\uff1a\u4f7f\u7528\u95ed\u5305\n  \u2022 \u590d\u6742\u7684\u72b6\u6001\u7ba1\u7406\uff1a\u8003\u8651\u4f7f\u7528\u7c7b\n  \u2022 \u6027\u80fd\u654f\u611f\u573a\u666f\uff1a\u6ce8\u610f\u95ed\u5305\u7684\u5f00\u9500\n\n\u539f\u52194\uff1a\u4fdd\u6301\u95ed\u5305\u7b80\u5355\n  \u2022 \u6bcf\u4e2a\u95ed\u5305\u5e94\u8be5\u53ea\u505a\u4e00\u4ef6\u4e8b\n  \u2022 \u907f\u514d\u5728\u95ed\u5305\u4e2d\u5b9e\u73b0\u590d\u6742\u903b\u8f91\n  \u2022 \u95ed\u5305\u5e94\u8be5\u662f\u53ef\u6d4b\u8bd5\u7684\n\n\u539f\u52195\uff1a\u6b63\u786e\u5904\u7406\u53ef\u53d8\u72b6\u6001\n  \u2022 \u5c3d\u91cf\u4f7f\u7528\u4e0d\u53ef\u53d8\u72b6\u6001\n  \u2022 \u5982\u679c\u5fc5\u987b\u4f7f\u7528\u53ef\u53d8\u72b6\u6001\uff0c\u786e\u4fdd\u6b63\u786e\u540c\u6b65\n  \u2022 \u4f7f\u7528nonlocal\u6216\u53ef\u53d8\u5bf9\u8c61\u6765\u4fee\u6539\u5916\u90e8\u53d8\u91cf\n\n\u539f\u52196\uff1a\u6ce8\u610f\u6027\u80fd\u5f71\u54cd\n  \u2022 \u95ed\u5305\u7684\u521b\u5efa\u548c\u8c03\u7528\u6709\u4e00\u5b9a\u5f00\u9500\n  \u2022 \u907f\u514d\u5728\u6027\u80fd\u654f\u611f\u7684\u5faa\u73af\u4e2d\u521b\u5efa\u95ed\u5305\n  \u2022 \u8003\u8651\u7f13\u5b58\u95ed\u5305\u521b\u5efa\u7684\u7ed3\u679c\n\n\u539f\u52197\uff1a\u63d0\u4f9b\u6e05\u6670\u7684\u63a5\u53e3\n  \u2022 \u95ed\u5305\u5e94\u8be5\u63d0\u4f9b\u6e05\u6670\u7684\u63a5\u53e3\n  \u2022 \u9690\u85cf\u5b9e\u73b0\u7ec6\u8282\n  \u2022 \u63d0\u4f9b\u9002\u5f53\u7684\u9519\u8bef\u5904\u7406\n\n\u539f\u52198\uff1a\u6d4b\u8bd5\u95ed\u5305\n  \u2022 \u5355\u72ec\u6d4b\u8bd5\u95ed\u5305\u7684\u884c\u4e3a\n  \u2022 \u6d4b\u8bd5\u95ed\u5305\u4e0e\u4e0d\u540c\u4e0a\u4e0b\u6587\u7684\u4ea4\u4e92\n  \u2022 \u6d4b\u8bd5\u95ed\u5305\u7684\u5185\u5b58\u7ba1\u7406\n\n\u95ed\u5305\u7684\u5e38\u89c1\u9677\u9631\uff1a\n1. \u5faa\u73af\u5f15\u7528\uff1a\u95ed\u5305\u5f15\u7528\u5916\u90e8\u53d8\u91cf\uff0c\u5916\u90e8\u53d8\u91cf\u53c8\u5f15\u7528\u95ed\u5305\n2. \u610f\u5916\u5171\u4eab\uff1a\u591a\u4e2a\u95ed\u5305\u5171\u4eab\u540c\u4e00\u4e2a\u53d8\u91cf\n3. \u5185\u5b58\u6cc4\u6f0f\uff1a\u95ed\u5305\u4fdd\u6301\u5bf9\u4e0d\u518d\u9700\u8981\u5bf9\u8c61\u7684\u5f15\u7528\n4. \u8fc7\u5ea6\u5c01\u88c5\uff1a\u5c06\u7b80\u5355\u7684\u529f\u80fd\u8fc7\u5ea6\u590d\u6742\u5316\n\n\u4f55\u65f6\u4f7f\u7528\u95ed\u5305\uff1a\n1. \u9700\u8981\u521b\u5efa\u6709\u72b6\u6001\u7684\u51fd\u6570\u65f6\n2. \u9700\u8981\u5b9e\u73b0\u56de\u8c03\u51fd\u6570\u65f6\n3. \u9700\u8981\u521b\u5efa\u51fd\u6570\u5de5\u5382\u65f6\n4. \u9700\u8981\u5c01\u88c5\u79c1\u6709\u6570\u636e\u65f6\n5. \u9700\u8981\u5b9e\u73b0\u88c5\u9970\u5668\u65f6\n\n\u4f55\u65f6\u4e0d\u4f7f\u7528\u95ed\u5305\uff1a\n1. \u9700\u8981\u590d\u6742\u7684\u72b6\u6001\u7ba1\u7406\u65f6\uff08\u8003\u8651\u4f7f\u7528\u7c7b\uff09\n2. \u9700\u8981\u7ee7\u627f\u548c\u591a\u6001\u65f6\n3. \u6027\u80fd\u662f\u5173\u952e\u8003\u8651\u56e0\u7d20\u65f6\n4. \u4ee3\u7801\u9700\u8981\u88ab\u591a\u79cd\u8bed\u8a00\u590d\u7528\u65f6\n\n\u672a\u6765\u8d8b\u52bf\uff1a\n1. \u66f4\u597d\u7684\u95ed\u5305\u4f18\u5316\uff1a\u7f16\u8bd1\u5668\u5bf9\u95ed\u5305\u7684\u4f18\u5316\u8d8a\u6765\u8d8a\u597d\n2. \u66f4\u4e30\u5bcc\u7684\u95ed\u5305\u8bed\u6cd5\uff1a\u66f4\u591a\u8bed\u8a00\u652f\u6301\u7b80\u6d01\u7684\u95ed\u5305\u8bed\u6cd5\n3. \u66f4\u597d\u7684\u5de5\u5177\u652f\u6301\uff1a\u8c03\u8bd5\u5668\u548c\u5206\u6790\u5668\u5bf9\u95ed\u5305\u7684\u652f\u6301\u66f4\u597d\n4. \u51fd\u6570\u5f0f\u7f16\u7a0b\u7684\u666e\u53ca\uff1a\u95ed\u5305\u4f5c\u4e3a\u51fd\u6570\u5f0f\u7f16\u7a0b\u7684\u6838\u5fc3\u6982\u5ff5\u66f4\u53d7\u91cd\u89c6\n\n\u7ed3\u8bed\uff1a\u95ed\u5305\u662f\u5f3a\u5927\u7684\u62bd\u8c61\u5de5\u5177\n\u95ed\u5305\u8ba9\u6211\u4eec\u80fd\u591f\u521b\u5efa\u66f4\u7075\u6d3b\u3001\u66f4\u6a21\u5757\u5316\u7684\u4ee3\u7801\u3002\n\u7406\u89e3\u95ed\u5305\u4e0d\u4ec5\u6709\u52a9\u4e8e\u7f16\u5199\u66f4\u597d\u7684\u4ee3\u7801\uff0c\u8fd8\u6709\u52a9\u4e8e\u7406\u89e3\u51fd\u6570\u5f0f\u7f16\u7a0b\u3001\n\u5f02\u6b65\u7f16\u7a0b\u548c\u73b0\u4ee3\u8f6f\u4ef6\u8bbe\u8ba1\u7684\u6838\u5fc3\u601d\u60f3\u3002\n\"\"\")<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u603b\u7ed3<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">5.1 \u95ed\u5305\u7684\u6838\u5fc3\u6d1e\u89c1<\/h3>\n\n\n\n<p>\u901a\u8fc7\u8fd9\u5802\u8bfe\uff0c\u6211\u4eec\u83b7\u5f97\u4e86\u4ee5\u4e0b\u6838\u5fc3\u6d1e\u89c1\uff1a<\/p>\n\n\n\n<p><strong>\u95ed\u5305\u662f\u51fd\u6570\u4e0e\u73af\u5883\u7684\u7ed3\u5408<\/strong>\uff1a\u95ed\u5305\u4e0d\u4ec5\u5305\u542b\u51fd\u6570\u4ee3\u7801\uff0c\u8fd8\u5305\u542b\u5176\u521b\u5efa\u65f6\u7684\u8bcd\u6cd5\u73af\u5883\u3002<\/p>\n\n\n\n<p><strong>\u95ed\u5305\u5b9e\u73b0\u72b6\u6001\u5c01\u88c5<\/strong>\uff1a\u95ed\u5305\u53ef\u4ee5\u6355\u83b7\u548c\u5c01\u88c5\u72b6\u6001\uff0c\u521b\u5efa\u6709\u72b6\u6001\u7684\u51fd\u6570\u3002<\/p>\n\n\n\n<p><strong>\u95ed\u5305\u652f\u6301\u9ad8\u9636\u62bd\u8c61<\/strong>\uff1a\u95ed\u5305\u662f\u51fd\u6570\u4f5c\u4e3a\u4e00\u7b49\u516c\u6c11\u7684\u76f4\u63a5\u4f53\u73b0\uff0c\u652f\u6301\u9ad8\u9636\u51fd\u6570\u548c\u51fd\u6570\u7ec4\u5408\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">5.2 \u95ed\u5305\u7684\u4f18\u52bf<\/h3>\n\n\n\n<p><strong>\u6570\u636e\u5c01\u88c5\u548c\u9690\u79c1<\/strong>\uff1a\u95ed\u5305\u53ef\u4ee5\u521b\u5efa\u79c1\u6709\u53d8\u91cf\uff0c\u53ea\u901a\u8fc7\u63a5\u53e3\u8bbf\u95ee\u3002<\/p>\n\n\n\n<p><strong>\u4ee3\u7801\u590d\u7528\u548c\u7ec4\u5408<\/strong>\uff1a\u95ed\u5305\u53ef\u4ee5\u4f5c\u4e3a\u51fd\u6570\u5de5\u5382\uff0c\u52a8\u6001\u751f\u6210\u51fd\u6570\u3002<\/p>\n\n\n\n<p><strong>\u5f02\u6b65\u7f16\u7a0b\u652f\u6301<\/strong>\uff1a\u95ed\u5305\u5728\u56de\u8c03\u51fd\u6570\u548c\u4e8b\u4ef6\u5904\u7406\u4e2d\u975e\u5e38\u6709\u7528\u3002<\/p>\n\n\n\n<p><strong>\u51fd\u6570\u5f0f\u7f16\u7a0b\u57fa\u7840<\/strong>\uff1a\u95ed\u5305\u652f\u6301\u67ef\u91cc\u5316\u3001\u90e8\u5206\u5e94\u7528\u3001\u51fd\u6570\u7ec4\u5408\u7b49\u6a21\u5f0f\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">5.3 \u5b9e\u7528\u5efa\u8bae<\/h3>\n\n\n\n<p><strong>\u4f55\u65f6\u4f7f\u7528\u95ed\u5305\uff1a<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5f53\u9700\u8981\u521b\u5efa\u6709\u72b6\u6001\u7684\u51fd\u6570\u65f6<\/li>\n\n\n\n<li>\u5f53\u9700\u8981\u5c01\u88c5\u79c1\u6709\u6570\u636e\u65f6<\/li>\n\n\n\n<li>\u5f53\u9700\u8981\u5b9e\u73b0\u56de\u8c03\u51fd\u6570\u65f6<\/li>\n\n\n\n<li>\u5f53\u9700\u8981\u521b\u5efa\u51fd\u6570\u5de5\u5382\u65f6<\/li>\n<\/ul>\n\n\n\n<p><strong>\u4f55\u65f6\u4e0d\u4f7f\u7528\u95ed\u5305\uff1a<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5f53\u9700\u8981\u590d\u6742\u7684\u72b6\u6001\u7ba1\u7406\u65f6\uff08\u8003\u8651\u4f7f\u7528\u7c7b\uff09<\/li>\n\n\n\n<li>\u5f53\u9700\u8981\u7ee7\u627f\u548c\u591a\u6001\u65f6<\/li>\n\n\n\n<li>\u5f53\u6027\u80fd\u662f\u5173\u952e\u8003\u8651\u56e0\u7d20\u65f6<\/li>\n\n\n\n<li>\u5f53\u4ee3\u7801\u9700\u8981\u88ab\u591a\u79cd\u8bed\u8a00\u590d\u7528\u65f6<\/li>\n<\/ul>\n\n\n\n<p><strong>\u95ed\u5305\u8bbe\u8ba1\u539f\u5219\uff1a<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5355\u4e00\u804c\u8d23\uff1a\u6bcf\u4e2a\u95ed\u5305\u53ea\u505a\u4e00\u4ef6\u4e8b<\/li>\n\n\n\n<li>\u660e\u786e\u63a5\u53e3\uff1a\u63d0\u4f9b\u6e05\u6670\u7684\u8f93\u5165\u8f93\u51fa<\/li>\n\n\n\n<li>\u6ce8\u610f\u751f\u547d\u5468\u671f\uff1a\u7406\u89e3\u53d8\u91cf\u7684\u6355\u83b7\u548c\u91ca\u653e<\/li>\n\n\n\n<li>\u4fdd\u6301\u7b80\u5355\uff1a\u907f\u514d\u8fc7\u5ea6\u590d\u6742\u7684\u95ed\u5305<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">5.4 \u8bed\u8a00\u9009\u62e9\u5efa\u8bae<\/h3>\n\n\n\n<p><strong>JavaScript<\/strong>\uff1a\u95ed\u5305\u65e0\u5904\u4e0d\u5728\uff0c\u662f\u8bed\u8a00\u7684\u6838\u5fc3\u7279\u6027\u3002<\/p>\n\n\n\n<p><strong>Python<\/strong>\uff1a\u95ed\u5305\u529f\u80fd\u5b8c\u6574\uff0c\u4f7f\u7528nonlocal\u5904\u7406\u53d8\u91cf\u3002<\/p>\n\n\n\n<p><strong>Rust<\/strong>\uff1a\u95ed\u5305\u662ftrait\u5bf9\u8c61\uff0c\u6709Fn\u3001FnMut\u3001FnOnce\u4e09\u79cd\u7c7b\u578b\u3002<\/p>\n\n\n\n<p><strong>C++<\/strong>\uff1aLambda\u8868\u8fbe\u5f0f\uff0c\u663e\u5f0f\u6355\u83b7\u5217\u8868\uff0c\u9700\u8981\u6ce8\u610f\u751f\u547d\u5468\u671f\u3002<\/p>\n\n\n\n<p><strong>Go<\/strong>\uff1a\u533f\u540d\u51fd\u6570\uff0c\u95ed\u5305\u7b80\u5355\u76f4\u63a5\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">5.5 \u7ec8\u6781\u76ee\u6807\uff1a\u7f16\u5199\u58f0\u660e\u5f0f\u7684\u4ee3\u7801<\/h3>\n\n\n\n<p>\u95ed\u5305\u8ba9\u6211\u4eec\u80fd\u591f\u4ee5\u58f0\u660e\u5f0f\u7684\u65b9\u5f0f\u601d\u8003\u95ee\u9898\uff1a<\/p>\n\n\n\n<p><strong>\u51fd\u6570\u5373\u6570\u636e<\/strong>\uff1a\u51fd\u6570\u53ef\u4ee5\u50cf\u6570\u636e\u4e00\u6837\u4f20\u9012\u548c\u64cd\u4f5c\u3002<\/p>\n\n\n\n<p><strong>\u72b6\u6001\u5373\u73af\u5883<\/strong>\uff1a\u72b6\u6001\u53ef\u4ee5\u901a\u8fc7\u73af\u5883\u6355\u83b7\uff0c\u800c\u4e0d\u662f\u663e\u5f0f\u4f20\u9012\u3002<\/p>\n\n\n\n<p><strong>\u7ec4\u5408\u5373\u62bd\u8c61<\/strong>\uff1a\u901a\u8fc7\u7ec4\u5408\u7b80\u5355\u51fd\u6570\u6765\u6784\u5efa\u590d\u6742\u529f\u80fd\u3002<\/p>\n\n\n\n<p>\u901a\u8fc7\u672c\u8bfe\u7684\u5b66\u4e60\uff0c\u4f60\u5e94\u8be5\u638c\u63e1\u4e86\u95ed\u5305\u7684\u6838\u5fc3\u6982\u5ff5\uff0c\u5e76\u80fd\u591f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\u5e94\u7528\u8fd9\u4e9b\u5f3a\u5927\u7684\u7279\u6027\uff0c\u521b\u5efa\u66f4\u52a0\u7075\u6d3b\u3001\u6a21\u5757\u5316\u3001\u53ef\u7ef4\u62a4\u7684\u4ee3\u7801\u3002<\/p>\n\n\n\n<p>\u7b2c\u516d\u5341\u8bfe\uff1a\u95ed\u5305 &#8211; \u51fd\u6570\u4e0e\u5176\u8bcd\u6cd5\u73af\u5883\uff01\u5b8c\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u7b2c61\u8bfe\uff1a\u8bbe\u8ba1\u539f\u5219 \u2014\u2014 \u4ece\u95ed\u5305\u5230\u53ef\u7ef4\u62a4\u7684\u4ee3\u7801\u67b6\u6784<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\u4e00\u3001\u4e3a\u4ec0\u4e48\u5728\u201c\u95ed\u5305\u201d\u4e4b\u540e\u8ba8\u8bba\u201c\u8bbe\u8ba1\u539f\u5219\u201d\uff1f<\/strong><\/h3>\n\n\n\n<p>\u5728\u638c\u63e1\u4e86\u95ed\u5305\u8fd9\u6837\u5f3a\u5927\u7684\u6280\u672f\u5de5\u5177\u540e\uff0c\u6211\u4eec\u9762\u4e34\u4e00\u4e2a\u65b0\u7684\u95ee\u9898\uff1a<strong>\u201c\u5982\u4f55\u4f7f\u7528\u8fd9\u4e9b\u5de5\u5177\uff0c\u6784\u5efa\u51fa\u6e05\u6670\u3001\u5065\u58ee\u3001\u6613\u4e8e\u7406\u89e3\u548c\u7ef4\u62a4\u7684\u4ee3\u7801\uff1f\u201d<\/strong> \u8fd9\u5c31\u50cf\u5b66\u4f1a\u4e86\u5404\u79cd\u6728\u6750\u7684\u8fde\u63a5\u65b9\u5f0f\uff08\u69ab\u536f\u3001\u80f6\u5408\u3001\u9489\u63a5\uff09\u540e\uff0c\u9700\u8981\u5b66\u4e60\u5efa\u7b51\u5b66\u7684\u539f\u7406\uff0c\u624d\u80fd\u9020\u51fa\u575a\u56fa\u3001\u5b9e\u7528\u3001\u7f8e\u89c2\u7684\u623f\u5b50\uff0c\u800c\u975e\u4e00\u5806\u6742\u4e71\u7684\u7ed3\u6784\u3002<\/p>\n\n\n\n<p>\u95ed\u5305\u4e3a\u5b9e\u73b0\u67d0\u4e9b\u7ecf\u5178\u7684\u8bbe\u8ba1\u6a21\u5f0f\uff08\u5982\u6a21\u5757\u6a21\u5f0f\u3001\u7b56\u7565\u6a21\u5f0f\uff09\u63d0\u4f9b\u4e86\u5e95\u5c42\u652f\u6301\u3002\u7136\u800c\uff0c\u82e5\u6ca1\u6709\u8bbe\u8ba1\u539f\u5219\u7684\u6307\u5bfc\uff0c\u5bf9\u95ed\u5305\u7684\u6ee5\u7528\u53cd\u800c\u4f1a\u5bfc\u81f4\u4ee3\u7801\u96be\u4ee5\u8ddf\u8e2a\u548c\u8c03\u8bd5\uff08\u5982\u8fc7\u5ea6\u5d4c\u5957\u3001\u4f5c\u7528\u57df\u6cc4\u6f0f\uff09\u3002\u56e0\u6b64\uff0c\u672c\u7ae0\u65e8\u5728\u5c06\u4f60\u7684\u7f16\u7a0b\u89c6\u89d2\uff0c\u4ece\u201c\u8bed\u6cd5\u6280\u5de7\u201d\u548c\u201c\u7279\u6027\u5b9e\u73b0\u201d\u63d0\u5347\u5230\u201c\u7ed3\u6784\u8bbe\u8ba1\u201d\u7684\u5c42\u9762\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\u4e8c\u3001\u4ec0\u4e48\u662f\u8bbe\u8ba1\u539f\u5219\uff1f<\/strong><\/h3>\n\n\n\n<p>\u8bbe\u8ba1\u539f\u5219\u662f\u8f6f\u4ef6\u8bbe\u8ba1\u9886\u57df\u63d0\u70bc\u51fa\u7684<strong>\u9ad8\u7ea7\u6307\u5bfc\u601d\u60f3<\/strong>\u548c<strong>\u6700\u4f73\u5b9e\u8df5\u5171\u8bc6<\/strong>\u3002\u5b83\u4eec\u4e0d\u5173\u5fc3\u5177\u4f53\u7684\u8bed\u6cd5\u6216API\uff0c\u800c\u662f\u5173\u6ce8\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u5982\u4f55\u7ec4\u7ec7\u4ee3\u7801\u5355\u5143\uff08\u7c7b\u3001\u51fd\u6570\u3001\u6a21\u5757\uff09\uff1f<\/strong><\/li>\n\n\n\n<li><strong>\u4ee3\u7801\u5355\u5143\u4e4b\u95f4\u5e94\u5982\u4f55\u4ea4\u4e92\uff1f<\/strong><\/li>\n\n\n\n<li><strong>\u53d8\u5316\u6765\u4e34\u65f6\uff0c\u5982\u4f55\u5c06\u5f71\u54cd\u5c40\u90e8\u5316\uff1f<\/strong><\/li>\n<\/ul>\n\n\n\n<p><strong>\u6838\u5fc3\u76ee\u6807<\/strong>\uff1a\u521b\u5efa<strong>\u9ad8\u5185\u805a\u3001\u4f4e\u8026\u5408<\/strong>\u7684\u7cfb\u7edf\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u9ad8\u5185\u805a<\/strong>\uff1a\u4e00\u4e2a\u6a21\u5757\uff08\u7c7b\u3001\u51fd\u6570\uff09\u5185\u90e8\u7684\u5143\u7d20\u5f7c\u6b64\u7d27\u5bc6\u76f8\u5173\uff0c\u5171\u540c\u5b8c\u6210\u4e00\u4e2a\u660e\u786e\u7684\u4efb\u52a1\u3002<\/li>\n\n\n\n<li><strong>\u4f4e\u8026\u5408<\/strong>\uff1a\u6a21\u5757\u4e4b\u95f4\u7684\u4f9d\u8d56\u5173\u7cfb\u5c3d\u53ef\u80fd\u7b80\u5355\u3001\u660e\u786e\uff0c\u4fee\u6539\u4e00\u4e2a\u6a21\u5757\u65f6\uff0c\u5e94\u5c3d\u91cf\u51cf\u5c11\u5bf9\u5176\u4ed6\u6a21\u5757\u7684\u5f71\u54cd\u3002<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\u4e09\u3001\u51e0\u4e2a\u6838\u5fc3\u7684\u8bbe\u8ba1\u539f\u5219\u4e0e\u6ce8\u91ca\u8bb2\u89e3<\/strong><\/h3>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>1. DRY (Don&#8217;t Repeat Yourself) &#8211; \u4e0d\u8981\u91cd\u590d\u4f60\u81ea\u5df1<\/strong><\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u662f\u4ec0\u4e48<\/strong>\uff1a\u77e5\u8bc6\u6216\u903b\u8f91\u5728\u7cfb\u7edf\u4e2d\u5e94\u6709\u5355\u4e00\u3001\u660e\u786e\u3001\u6743\u5a01\u7684\u8868\u793a\u3002<\/li>\n\n\n\n<li><strong>\u4e0d\u662f\u4ec0\u4e48<\/strong>\uff1a\u76f2\u76ee\u5730\u5408\u5e76\u6240\u6709\u76f8\u4f3c\u7684\u4ee3\u7801\u3002\u6709\u65f6\uff0c\u4e24\u6bb5\u4ee3\u7801\u770b\u4f3c\u76f8\u540c\uff0c\u4f46\u4ee3\u8868\u4e0d\u540c\u7684\u201c\u77e5\u8bc6\u201d\uff08\u672a\u6765\u53ef\u80fd\u72ec\u7acb\u53d8\u5316\uff09\uff0c\u5408\u5e76\u53cd\u800c\u4f1a\u589e\u52a0\u8026\u5408\u3002<\/li>\n\n\n\n<li><strong>\u6ce8\u91ca\u4e0e\u793a\u4f8b<\/strong>\uff1a <code>\/\/ \u574f\u5473\u9053\uff1a\u91cd\u590d\u7684\u201c\u77e5\u8bc6\u201d function calculateCircleArea(radius) { return 3.14159 * radius * radius; } function calculateCircleCircumference(radius) { return 2 * 3.14159 * radius; } \/\/ \u03c0\u7684\u503c\u548c\u8ba1\u7b97\u516c\u5f0f\u662f\u91cd\u590d\u7684\u201c\u77e5\u8bc6\u201d\u3002 \/\/ \u91cd\u6784\uff1a\u63d0\u53d6\u5355\u4e00\u6743\u5a01\u8868\u793a const PI = 3.14159; \/\/ \u5355\u4e00\u6743\u5a01\u8868\u793a function calculateCircleArea(radius) { return PI * radius * radius; } function calculateCircleCircumference(radius) { return 2 * PI * radius; } \/\/ \u4fee\u6539PI\u7684\u503c\u53ea\u9700\u5728\u4e00\u5904\u8fdb\u884c\u3002<\/code> <strong>\u6ce8\u91ca<\/strong>\uff1aDRY\u539f\u5219\u4e0d\u4ec5\u9488\u5bf9\u4ee3\u7801\u6587\u672c\uff0c\u66f4\u9488\u5bf9\u201c\u4e1a\u52a1\u89c4\u5219\u201d\u548c\u201c\u6838\u5fc3\u77e5\u8bc6\u201d\u3002\u5728\u4e0a\u4f8b\u4e2d\uff0c<code>PI<\/code>\u7684\u503c\u5c31\u662f\u4e00\u9879\u5173\u952e\u77e5\u8bc6\u3002\u8fdd\u53cdDRY\u4e0d\u4ec5\u589e\u52a0\u7ef4\u62a4\u6210\u672c\uff0c\u8fd8\u6781\u6613\u5bfc\u81f4\u4fee\u6539\u4e0d\u540c\u6b65\uff0c\u5f15\u53d1Bug\u3002<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>2. KISS (Keep It Simple, Stupid) &#8211; \u4fdd\u6301\u7b80\u5355\u76f4\u767d<\/strong><\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u662f\u4ec0\u4e48<\/strong>\uff1a\u8bbe\u8ba1\u5e94\u5c3d\u53ef\u80fd\u7b80\u5355\uff0c\u907f\u514d\u4e0d\u5fc5\u8981\u7684\u590d\u6742\u6027\u3002<\/li>\n\n\n\n<li><strong>\u5b9e\u8df5<\/strong>\uff1a\u7528\u6700\u76f4\u63a5\u7684\u65b9\u5f0f\u89e3\u51b3\u95ee\u9898\u3002\u4f18\u5148\u4f7f\u7528\u7b80\u5355\u7684\u8bed\u8a00\u7279\u6027\u3001\u6e05\u6670\u7684\u6570\u636e\u7ed3\u6784\u3002\u4e0d\u8981\u4e3a\u4e86\u201c\u70ab\u6280\u201d\u800c\u4f7f\u7528\u6666\u6da9\u96be\u61c2\u7684\u4ee3\u7801\u3002<\/li>\n\n\n\n<li><strong>\u6ce8\u91ca\u4e0e\u793a\u4f8b<\/strong>\uff1a<br><code>javascript \/\/ \u8fc7\u4e8e\u201c\u806a\u660e\u201d\u4e14\u8106\u5f31 function isEven(num) { return !!(num &amp; 1) ? false : true; } \/\/ \u7b80\u5355\u76f4\u767d\uff0c\u4e00\u76ee\u4e86\u7136 function isEven(num) { return num % 2 === 0; }<\/code><br>> <strong>\u6ce8\u91ca<\/strong>\uff1a\u7b80\u5355\u7684\u4ee3\u7801\u610f\u5473\u7740\u66f4\u4f4e\u7684\u8ba4\u77e5\u8d1f\u8377\u3001\u66f4\u5c11\u7684\u9519\u8bef\u548c\u66f4\u9ad8\u7684\u53ef\u7ef4\u62a4\u6027\u3002\u5728\u56e2\u961f\u534f\u4f5c\u4e2d\uff0c\u8fd9\u4e00\u70b9\u81f3\u5173\u91cd\u8981\u3002\u901a\u5e38\uff0c\u7b80\u5355\u7684\u89e3\u51b3\u65b9\u6848\u6765\u81ea\u4e8e\u5bf9\u95ee\u9898\u7684\u6df1\u523b\u7406\u89e3\uff0c\u800c\u975e\u6280\u5de7\u7684\u5806\u780c\u3002<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>3. YAGNI (You Aren&#8217;t Gonna Need It) &#8211; \u4f60\u4e0d\u4f1a\u9700\u8981\u5b83<\/strong><\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u662f\u4ec0\u4e48<\/strong>\uff1a\u4e0d\u8981\u4e3a\u672a\u6765\u53ef\u80fd\u7684\u9700\u6c42\u6dfb\u52a0\u5f53\u524d\u4e0d\u9700\u8981\u7684\u529f\u80fd\u3002<\/li>\n\n\n\n<li><strong>\u4e3a\u4ec0\u4e48<\/strong>\uff1a\u9884\u8bbe\u8ba1\u901a\u5e38\u57fa\u4e8e\u731c\u6d4b\uff0c\u5f80\u5f80\u9519\u8bef\u3002\u591a\u4f59\u7684\u4ee3\u7801\u4f1a\u589e\u52a0\u590d\u6742\u6027\u3001\u6d4b\u8bd5\u8d1f\u62c5\uff0c\u5e76\u53ef\u80fd\u5f15\u5165\u5f53\u524d\u672a\u8003\u8651\u5230\u7684Bug\u3002<\/li>\n\n\n\n<li><strong>\u6ce8\u91ca<\/strong>\uff1a\u8fd9\u4e0e\u201c\u63d0\u524d\u8bbe\u8ba1\u67b6\u6784\u201d\u5e76\u4e0d\u77db\u76fe\u3002\u67b6\u6784\u8bbe\u8ba1\u5e94\u5bf9\u63a5<strong>\u5f53\u524d\u660e\u786e\u7684<\/strong>\u9700\u6c42\uff0c\u5e76\u4e3a<strong>\u5df2\u8bc6\u522b\u7684<\/strong>\u53d8\u5316\u70b9\u7559\u51fa\u6269\u5c55\u7a7a\u95f4\uff08\u901a\u8fc7\u9075\u5faa\u5176\u4ed6\u539f\u5219\uff0c\u5982\u5f00\u95ed\u539f\u5219\uff09\u3002YAGNI\u53cd\u5bf9\u7684\u662f\u4e3a\u201c\u4e07\u4e00\u4ee5\u540e\u2026\u2026\u201d\u8fd9\u79cd\u6a21\u7cca\u731c\u60f3\u800c\u7f16\u5199\u5177\u4f53\u5b9e\u73b0\u4ee3\u7801\u3002<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>4. \u5173\u6ce8\u70b9\u5206\u79bb (Separation of Concerns, SoC)<\/strong><\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u662f\u4ec0\u4e48<\/strong>\uff1a\u5c06\u7a0b\u5e8f\u5206\u89e3\u4e3a\u4e0d\u540c\u7684\u90e8\u5206\uff0c\u6bcf\u4e2a\u90e8\u5206\u89e3\u51b3\u4e00\u4e2a\u72ec\u7acb\u7684\u201c\u5173\u6ce8\u70b9\u201d\uff08\u5982\u6570\u636e\u5b58\u53d6\u3001\u4e1a\u52a1\u903b\u8f91\u3001\u7528\u6237\u754c\u9762\uff09\u3002<\/li>\n\n\n\n<li><strong>\u4f8b\u5b50<\/strong>\uff1aMVC (Model-View-Controller)\u3001MVVM\u67b6\u6784\u5c31\u662fSoC\u7684\u7ecf\u5178\u4f53\u73b0\u3002<\/li>\n\n\n\n<li><strong>\u6ce8\u91ca\u4e0e\u793a\u4f8b<\/strong>\uff1a <code>\/\/ \u6df7\u6742\u4ea4\u7ec7\u7684\u4ee3\u7801\uff08\u5173\u6ce8\u70b9\u672a\u5206\u79bb\uff09 function handleUserSubmit() { const input = document.getElementById('userInput').value; \/\/ 1. \u9a8c\u8bc1\u8f93\u5165\uff08\u4e1a\u52a1\u903b\u8f91\uff09 if (!input || input.length &lt; 3) { alert('\u8f93\u5165\u65e0\u6548\uff01'); \/\/ 2. \u7528\u6237\u4ea4\u4e92\uff08UI\uff09 return; } \/\/ 3. \u53d1\u9001\u6570\u636e\uff08\u6570\u636e\u901a\u4fe1\uff09 fetch('\/api\/save', { method: 'POST', body: JSON.stringify({ data: input }), }).then(() => { \/\/ 4. \u66f4\u65b0\u754c\u9762\uff08UI\uff09 document.getElementById('result').innerHTML = '\u4fdd\u5b58\u6210\u529f\uff01'; }); } \/\/ \u91cd\u6784\u540e\uff08\u5173\u6ce8\u70b9\u5206\u79bb\uff09 \/\/ \u4e1a\u52a1\u903b\u8f91\u5c42 function validateInput(input) { return input &amp;&amp; input.length >= 3; } function createPayload(input) { return { data: input }; } \/\/ \u6570\u636e\u901a\u4fe1\u5c42 async function saveData(payload) { \/* fetch... *\/ } \/\/ UI\/\u63a7\u5236\u5c42 async function handleUserSubmit() { const input = document.getElementById('userInput').value; if (!validateInput(input)) { \/\/ \u8c03\u7528\u4e1a\u52a1\u903b\u8f91 showError('\u8f93\u5165\u65e0\u6548\uff01'); \/\/ \u8c03\u7528UI\u51fd\u6570 return; } const payload = createPayload(input); \/\/ \u8c03\u7528\u4e1a\u52a1\u903b\u8f91 await saveData(payload); \/\/ \u8c03\u7528\u6570\u636e\u5c42 showSuccess('\u4fdd\u5b58\u6210\u529f\uff01'); \/\/ \u8c03\u7528UI\u51fd\u6570 } function showError(msg) { \/* \u66f4\u65b0UI\u663e\u793a\u9519\u8bef *\/ } function showSuccess(msg) { \/* \u66f4\u65b0UI\u663e\u793a\u6210\u529f *\/ }<\/code> <strong>\u6ce8\u91ca<\/strong>\uff1aSoC\u662f\u964d\u4f4e\u590d\u6742\u5ea6\u7684\u5229\u5668\u3002\u5206\u79bb\u540e\uff0c\u6bcf\u4e2a\u6a21\u5757\u804c\u8d23\u5355\u4e00\uff0c\u6613\u4e8e\u7406\u89e3\u3001\u6d4b\u8bd5\u548c\u590d\u7528\u3002\u5f53\u9700\u8981\u4fee\u6539UI\u6837\u5f0f\u65f6\uff0c\u4f60\u65e0\u9700\u62c5\u5fc3\u4f1a\u7834\u574f\u4e1a\u52a1\u9a8c\u8bc1\u903b\u8f91\u3002<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\u56db\u3001\u5411SOLID\u539f\u5219\u7684\u5ef6\u4f38\uff08\u9ad8\u9636\u6307\u5f15\uff09<\/strong><\/h3>\n\n\n\n<p>\u5728\u9762\u5411\u5bf9\u8c61\u7f16\u7a0b\u4e2d\uff0c\u6709\u4e94\u4e2a\u66f4\u5177\u4f53\u3001\u76f8\u4e92\u5173\u8054\u7684\u8bbe\u8ba1\u539f\u5219\uff0c\u9996\u5b57\u6bcd\u7f29\u5199\u4e3aSOLID\u3002\u5b83\u4eec\u662f\u6307\u5f15\u6211\u4eec\u5b9e\u73b0\u201c\u9ad8\u5185\u805a\u3001\u4f4e\u8026\u5408\u201d\u7684\u5f3a\u529b\u5de5\u5177\u96c6\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>S &#8211; \u5355\u4e00\u804c\u8d23\u539f\u5219<\/strong>\uff1a\u4e00\u4e2a\u7c7b\u53ea\u5e94\u6709\u4e00\u4e2a\u5f15\u8d77\u5b83\u53d8\u5316\u7684\u539f\u56e0\u3002<\/li>\n\n\n\n<li><strong>O &#8211; \u5f00\u95ed\u539f\u5219<\/strong>\uff1a\u8f6f\u4ef6\u5b9e\u4f53\u5e94\u5bf9\u6269\u5c55\u5f00\u653e\uff0c\u5bf9\u4fee\u6539\u5173\u95ed\u3002<\/li>\n\n\n\n<li><strong>L &#8211; \u91cc\u6c0f\u66ff\u6362\u539f\u5219<\/strong>\uff1a\u5b50\u7c7b\u5fc5\u987b\u80fd\u591f\u66ff\u6362\u5b83\u4eec\u7684\u7236\u7c7b\u800c\u4e0d\u5f71\u54cd\u7a0b\u5e8f\u7684\u6b63\u786e\u6027\u3002<\/li>\n\n\n\n<li><strong>I &#8211; \u63a5\u53e3\u9694\u79bb\u539f\u5219<\/strong>\uff1a\u5ba2\u6237\u7aef\u4e0d\u5e94\u88ab\u5f3a\u8feb\u4f9d\u8d56\u5b83\u4e0d\u4f7f\u7528\u7684\u65b9\u6cd5\u3002<\/li>\n\n\n\n<li><strong>D &#8211; \u4f9d\u8d56\u5012\u7f6e\u539f\u5219<\/strong>\uff1a\u9ad8\u5c42\u6a21\u5757\u4e0d\u5e94\u4f9d\u8d56\u4f4e\u5c42\u6a21\u5757\uff0c\u4e24\u8005\u90fd\u5e94\u4f9d\u8d56\u62bd\u8c61\u3002<\/li>\n<\/ul>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>\u6ce8\u91ca<\/strong>\uff1aSOLID\u539f\u5219\u662f\u8bbe\u8ba1\u539f\u5219\u7684\u6df1\u5316\u548c\u5177\u4f53\u5316\u3002\u867d\u7136\u5b83\u4eec\u6839\u690d\u4e8eOOP\uff0c\u4f46\u5176\u601d\u60f3\uff08\u5c24\u5176\u662f\u5355\u4e00\u804c\u8d23\u3001\u5f00\u95ed\u3001\u4f9d\u8d56\u5012\u7f6e\uff09\u5bf9\u51fd\u6570\u5f0f\u7f16\u7a0b\u548c\u6a21\u5757\u5316\u8bbe\u8ba1\u540c\u6837\u5177\u6709\u6df1\u523b\u7684\u542f\u53d1\u610f\u4e49\u3002\u7406\u89e3\u5b83\u4eec\u662f\u901a\u5f80\u9ad8\u7ea7\u8f6f\u4ef6\u67b6\u6784\u5e08\u7684\u5fc5\u7ecf\u4e4b\u8def\u3002<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\u603b\u7ed3<\/strong><\/h3>\n\n\n\n<p>\u7b2c61\u8bfe\u7684\u8bbe\u8ba1\u539f\u5219\uff0c\u4e3a\u4f60\u63d0\u4f9b\u4e86\u5728\u8bed\u6cd5\u548c\u7279\u6027\u4e4b\u4e0a\u7684<strong>\u5143\u8ba4\u77e5\u6846\u67b6<\/strong>\u3002\u5b83\u4eec\u56de\u7b54\u7684\u4e0d\u662f\u201c\u8fd9\u4e2a\u529f\u80fd\u5982\u4f55\u5b9e\u73b0\u201d\uff0c\u800c\u662f\u201c\u8fd9\u4e2a\u529f\u80fd<strong>\u5e94\u8be5\u653e\u5728\u54ea\u91cc<\/strong>\uff0c\u4ee5\u53ca<strong>\u5982\u4f55\u4e0e\u7cfb\u7edf\u5176\u4ed6\u90e8\u5206\u4f18\u96c5\u5730\u534f\u4f5c<\/strong>\u201d\u3002<\/p>\n\n\n\n<p>\u5f53\u4f60\u518d\u56de\u5934\u5ba1\u89c6\u7b2c60\u8bfe\u7684\u95ed\u5305\u65f6\uff0c\u4f60\u4f1a\u53d1\u73b0\uff0c\u4e00\u4e2a\u8bbe\u8ba1\u826f\u597d\u7684\u6a21\u5757\uff08\u5229\u7528\u95ed\u5305\u5b9e\u73b0\u79c1\u6709\u53d8\u91cf\uff09\uff0c\u6b63\u662f\u9075\u5faa\u4e86<strong>\u5355\u4e00\u804c\u8d23<\/strong>\u548c<strong>\u5173\u6ce8\u70b9\u5206\u79bb<\/strong>\u539f\u5219\u3002\u800c\u4e00\u4e2a\u63a5\u6536\u51fd\u6570\u4f5c\u4e3a\u53c2\u6570\u7684\u9ad8\u9636\u51fd\u6570\uff08\u95ed\u5305\u7684\u5e38\u89c1\u5e94\u7528\uff09\uff0c\u5219\u4fbf\u4e8e\u6211\u4eec\u672a\u6765\u9075\u5faa<strong>\u5f00\u95ed\u539f\u5219<\/strong>\u8fdb\u884c\u6269\u5c55\u3002<\/p>\n\n\n\n<p>\u638c\u63e1\u8bbe\u8ba1\u539f\u5219\uff0c\u80fd\u8ba9\u4f60\u5728\u7f16\u7a0b\u65f6\u505a\u51fa\u66f4\u660e\u667a\u7684\u51b3\u7b56\uff0c\u5199\u51fa\u4e0d\u4ec5\u80fd\u8ba9\u673a\u5668\u6b63\u786e\u6267\u884c\uff0c\u66f4\u80fd\u8ba9\u540c\u884c\uff08\u4ee5\u53ca\u672a\u6765\u7684\u4f60\uff09\u8f7b\u677e\u7406\u89e3\u7684\u4ee3\u7801\u3002\u8fd9\u662f\u4ece\u201c\u7a0b\u5e8f\u5458\u201d\u8d70\u5411\u201c\u5de5\u7a0b\u5e08\u201d\u7684\u5173\u952e\u4e00\u6b65\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>\u5ef6\u4f38\u601d\u8003<\/strong>\uff1a\u8bf7\u56de\u987e\u4f60\u4e4b\u524d\u5199\u8fc7\u7684\u9879\u76ee\u4ee3\u7801\uff0c\u627e\u51fa\u4e00\u5904\u8fdd\u53cd\u4e86DRY\u6216KISS\u539f\u5219\u7684\u5730\u65b9\uff0c\u5e76\u601d\u8003\u5982\u4f55\u91cd\u6784\u3002\u518d\u601d\u8003\u4e00\u4e0b\uff0c\u95ed\u5305\u5728\u4f60\u7684\u9879\u76ee\u4e2d\uff0c\u662f\u5e2e\u52a9\u8fd8\u662f\u963b\u788d\u4e86\u201c\u5173\u6ce8\u70b9\u5206\u79bb\u201d\uff1f<\/p>\n\n\n\n<h1 class=\"wp-block-heading\"><strong>\u7b2c62\u8bfe\uff1a\u8bbe\u8ba1\u6a21\u5f0f \u2014\u2014 \u57fa\u4e8e\u8bbe\u8ba1\u539f\u5219\u7684\u53ef\u590d\u7528\u89e3\u51b3\u65b9\u6848<\/strong><\/h1>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u4e00\u3001\u4e3a\u4ec0\u4e48\u5728\u201c\u8bbe\u8ba1\u539f\u5219\u201d\u4e4b\u540e\u8ba8\u8bba\u201c\u8bbe\u8ba1\u6a21\u5f0f\u201d\uff1f<\/strong><\/h2>\n\n\n\n<p>\u638c\u63e1\u4e86\u8bbe\u8ba1\u539f\u5219\u540e\uff0c\u4f60\u62e5\u6709\u4e86\u8bc4\u5224\u4ee3\u7801\u8bbe\u8ba1\u7684\u201c\u6807\u5c3a\u201d\uff0c\u77e5\u9053\u4ec0\u4e48\u662f\u4e0d\u597d\u7684\uff08\u8fdd\u53cdDRY\u3001KISS\u7b49\uff09\uff0c\u4ec0\u4e48\u662f\u597d\u7684\uff08\u9ad8\u5185\u805a\u3001\u4f4e\u8026\u5408\uff09\u3002\u4f46\u9762\u5bf9\u5177\u4f53\u95ee\u9898\u65f6\uff0c\u53ef\u80fd\u4ecd\u4f1a\u56f0\u60d1\uff1a\u201c<strong>\u5982\u4f55\u5177\u4f53\u843d\u5730\u8fd9\u4e9b\u539f\u5219\uff1f<\/strong>\u201d<\/p>\n\n\n\n<p>\u8bbe\u8ba1\u6a21\u5f0f\u6b63\u662f\u5728\u6b64\u80cc\u666f\u4e0b\u8bde\u751f\u7684\u7b54\u6848\u3002\u5b83\u4eec\u662f<strong>\u7ecf\u8fc7\u9a8c\u8bc1\u7684\u3001\u9488\u5bf9\u7279\u5b9a\u95ee\u9898\u7684\u53ef\u590d\u7528\u89e3\u51b3\u65b9\u6848\u6a21\u677f<\/strong>\u3002\u6b63\u5982\u5efa\u7b51\u5927\u5e08\u514b\u91cc\u65af\u6258\u5f17\u00b7\u4e9a\u5386\u5c71\u5927\u6240\u8bf4\uff1a\u201c\u6bcf\u4e2a\u6a21\u5f0f\u90fd\u63cf\u8ff0\u4e86\u4e00\u4e2a\u5728\u6211\u4eec\u73af\u5883\u4e2d\u53cd\u590d\u51fa\u73b0\u7684\u95ee\u9898\uff0c\u4ee5\u53ca\u8be5\u95ee\u9898\u89e3\u51b3\u65b9\u6848\u7684\u6838\u5fc3\u3002\u201d<\/p>\n\n\n\n<p><strong>\u5173\u952e\u7406\u89e3<\/strong>\uff1a\u8bbe\u8ba1\u6a21\u5f0f\u5e76\u975e\u8981\u4f60\u6b7b\u8bb0\u786c\u80cc\u7684\u4ee3\u7801\u6a21\u677f\uff0c\u800c\u662f<strong>\u89e3\u51b3\u95ee\u9898\u7684\u601d\u8def\u548c\u7ecf\u9a8c\u7684\u603b\u7ed3<\/strong>\u3002\u5b83\u4eec\u662f\u8bbe\u8ba1\u539f\u5219\u7684<strong>\u5177\u4f53\u5e94\u7528\u548c\u4f53\u73b0<\/strong>\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\u4e8c\u3001\u8bbe\u8ba1\u6a21\u5f0f\u5206\u7c7b\u6982\u89c8<\/strong><\/h3>\n\n\n\n<p>\u6839\u636e\u6a21\u5f0f\u7684\u76ee\u7684\u548c\u7528\u9014\uff0c\u7ecf\u5178\u7684GoF\u8bbe\u8ba1\u6a21\u5f0f\u53ef\u5206\u4e3a\u4e09\u7c7b\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u521b\u5efa\u578b\u6a21\u5f0f<\/strong>\uff1a\u5173\u6ce8\u5bf9\u8c61\u7684\u521b\u5efa\u673a\u5236\uff0c\u4f7f\u5bf9\u8c61\u521b\u5efa\u66f4\u7075\u6d3b\u3001\u66f4\u7b26\u5408\u7cfb\u7edf\u9700\u6c42\u3002<\/li>\n\n\n\n<li><strong>\u7ed3\u6784\u578b\u6a21\u5f0f<\/strong>\uff1a\u5173\u6ce8\u5982\u4f55\u7ec4\u5408\u7c7b\u548c\u5bf9\u8c61\u4ee5\u5f62\u6210\u66f4\u5927\u7684\u7ed3\u6784\uff0c\u63d0\u5347\u7cfb\u7edf\u7684\u7075\u6d3b\u6027\u548c\u53ef\u590d\u7528\u6027\u3002<\/li>\n\n\n\n<li><strong>\u884c\u4e3a\u578b\u6a21\u5f0f<\/strong>\uff1a\u5173\u6ce8\u5bf9\u8c61\u4e4b\u95f4\u7684\u804c\u8d23\u5206\u914d\u548c\u901a\u4fe1\u65b9\u5f0f\uff0c\u4f7f\u7cfb\u7edf\u66f4\u52a8\u6001\u3001\u66f4\u6613\u4e8e\u534f\u4f5c\u3002<\/li>\n<\/ol>\n\n\n\n<p>\u8fd9\u4e09\u7c7b\u6a21\u5f0f\u5171\u540c\u6784\u6210\u4e86\u9762\u5411\u5bf9\u8c61\u8bbe\u8ba1\u7684\u57fa\u77f3\uff0c\u5b83\u4eec<strong>\u76f8\u4e92\u5173\u8054\u3001\u76f8\u4e92\u8865\u5145<\/strong>\uff0c\u8bb8\u591a\u590d\u6742\u7cfb\u7edf\u4f1a\u540c\u65f6\u5e94\u7528\u591a\u79cd\u6a21\u5f0f\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u4e09\u3001\u521b\u5efa\u578b\u6a21\u5f0f\uff1a\u5c06\u5bf9\u8c61\u7684\u521b\u5efa\u4e0e\u4f7f\u7528\u5206\u79bb<\/strong><\/h2>\n\n\n\n<p><strong>\u6838\u5fc3\u601d\u60f3<\/strong>\uff1a\u5c01\u88c5\u5bf9\u8c61\u7684\u521b\u5efa\u8fc7\u7a0b\uff0c\u4f7f\u7cfb\u7edf\u4e0d\u4f9d\u8d56\u4e8e\u5bf9\u8c61\u521b\u5efa\u7684\u5177\u4f53\u7ec6\u8282\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>1. \u5de5\u5382\u65b9\u6cd5\u6a21\u5f0f\uff08Factory Method\uff09<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u95ee\u9898<\/strong>\uff1a\u5f53\u4e00\u4e2a\u7c7b\u65e0\u6cd5\u9884\u77e5\u9700\u8981\u521b\u5efa\u54ea\u79cd\u5177\u4f53\u5bf9\u8c61\uff0c\u6216\u5e0c\u671b\u5b50\u7c7b\u51b3\u5b9a\u521b\u5efa\u4ec0\u4e48\u5bf9\u8c61\u65f6\u3002<\/li>\n\n\n\n<li><strong>\u89e3\u51b3\u65b9\u6848<\/strong>\uff1a\u5b9a\u4e49\u4e00\u4e2a\u521b\u5efa\u5bf9\u8c61\u7684\u63a5\u53e3\uff0c\u4f46\u8ba9\u5b50\u7c7b\u51b3\u5b9a\u5b9e\u4f8b\u5316\u54ea\u4e2a\u7c7b\u3002<\/li>\n\n\n\n<li><strong>\u8bbe\u8ba1\u539f\u5219\u4f53\u73b0<\/strong>\uff1a\n<ul class=\"wp-block-list\">\n<li><strong>\u4f9d\u8d56\u5012\u7f6e\u539f\u5219<\/strong>\uff1a\u9ad8\u5c42\u6a21\u5757\uff08\u5ba2\u6237\u7aef\u4ee3\u7801\uff09\u4e0d\u4f9d\u8d56\u5177\u4f53\u4ea7\u54c1\u7c7b\uff0c\u800c\u662f\u4f9d\u8d56\u62bd\u8c61\u3002<\/li>\n\n\n\n<li><strong>\u5f00\u95ed\u539f\u5219<\/strong>\uff1a\u6dfb\u52a0\u65b0\u4ea7\u54c1\u65f6\uff0c\u53ea\u9700\u65b0\u589e\u5de5\u5382\u5b50\u7c7b\u548c\u4ea7\u54c1\u5b50\u7c7b\uff0c\u65e0\u9700\u4fee\u6539\u73b0\u6709\u5de5\u5382\u548c\u5ba2\u6237\u7aef\u4ee3\u7801\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u4ee3\u7801\u793a\u4f8b\u4e0e\u6ce8\u91ca<\/strong>\uff1a <code>\/\/ \u62bd\u8c61\u4ea7\u54c1\u63a5\u53e3 class Button { render() { throw new Error('\u5b50\u7c7b\u5fc5\u987b\u5b9e\u73b0render\u65b9\u6cd5'); } } \/\/ \u5177\u4f53\u4ea7\u54c1 class WindowsButton extends Button { render() { console.log('\u6e32\u67d3Windows\u98ce\u683c\u6309\u94ae'); } } class MacOSButton extends Button { render() { console.log('\u6e32\u67d3MacOS\u98ce\u683c\u6309\u94ae'); } } \/\/ \u62bd\u8c61\u521b\u5efa\u8005\uff08\u5de5\u5382\uff09 class Dialog { \/\/ \u5de5\u5382\u65b9\u6cd5\uff08\u62bd\u8c61\u6216\u9ed8\u8ba4\u5b9e\u73b0\uff09 createButton() { throw new Error('\u5b50\u7c7b\u5fc5\u987b\u5b9e\u73b0createButton\u65b9\u6cd5'); }render() { \/\/ \u4f7f\u7528\u5de5\u5382\u65b9\u6cd5\u521b\u5efa\u4ea7\u54c1\uff0c\u4f46\u4e0d\u5173\u5fc3\u5177\u4f53\u7c7b\u578b const button = this.createButton(); button.render(); }} \/\/ \u5177\u4f53\u521b\u5efa\u8005 class WindowsDialog extends Dialog { createButton() { return new WindowsButton(); } } class MacOSDialog extends Dialog { createButton() { return new MacOSButton(); } } \/\/ \u5ba2\u6237\u7aef\u4ee3\u7801\uff1a\u6839\u636e\u914d\u7f6e\u6216\u73af\u5883\u51b3\u5b9a\u4f7f\u7528\u54ea\u4e2a\u5177\u4f53\u5de5\u5382 const config = { os: 'mac' }; let dialog; if (config.os === 'windows') { dialog = new WindowsDialog(); } else { dialog = new MacOSDialog(); } dialog.render(); \/\/ \u8f93\u51fa\uff1a\u6e32\u67d3MacOS\u98ce\u683c\u6309\u94ae<\/code> <strong>\u6ce8\u91ca<\/strong>\uff1a\u5de5\u5382\u65b9\u6cd5\u5c06\u5bf9\u8c61\u521b\u5efa\u5ef6\u8fdf\u5230\u5b50\u7c7b\uff0c\u4f7f\u4ee3\u7801\u66f4\u7075\u6d3b\u3002\u5ba2\u6237\u7aef\u53ea\u4e0e\u62bd\u8c61\u63a5\u53e3\uff08Dialog\u3001Button\uff09\u4ea4\u4e92\uff0c\u5b9e\u73b0\u4e86\u4f9d\u8d56\u5012\u7f6e\u3002\u5f53\u9700\u8981\u65b0\u589eLinux\u6309\u94ae\u65f6\uff0c\u53ea\u9700\u6dfb\u52a0LinuxButton\u548cLinuxDialog\uff0c\u65e0\u9700\u4fee\u6539\u73b0\u6709\u4ee3\u7801\uff0c\u7b26\u5408\u5f00\u95ed\u539f\u5219\u3002<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>2. \u5355\u4f8b\u6a21\u5f0f\uff08Singleton\uff09<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u95ee\u9898<\/strong>\uff1a\u786e\u4fdd\u4e00\u4e2a\u7c7b\u53ea\u6709\u4e00\u4e2a\u5b9e\u4f8b\uff0c\u5e76\u63d0\u4f9b\u4e00\u4e2a\u5168\u5c40\u8bbf\u95ee\u70b9\uff08\u5982\u914d\u7f6e\u7ba1\u7406\u3001\u6570\u636e\u5e93\u8fde\u63a5\u6c60\uff09\u3002<\/li>\n\n\n\n<li><strong>\u89e3\u51b3\u65b9\u6848<\/strong>\uff1a\u79c1\u6709\u5316\u6784\u9020\u51fd\u6570\uff0c\u901a\u8fc7\u9759\u6001\u65b9\u6cd5\u63a7\u5236\u5b9e\u4f8b\u7684\u521b\u5efa\u548c\u8bbf\u95ee\u3002<\/li>\n\n\n\n<li><strong>\u8bbe\u8ba1\u539f\u5219\u4f53\u73b0<\/strong>\uff1a\n<ul class=\"wp-block-list\">\n<li><strong>\u5355\u4e00\u804c\u8d23\u539f\u5219<\/strong>\uff1a\u5355\u4f8b\u7c7b\u53ea\u8d1f\u8d23\u7ba1\u7406\u81ea\u5df1\u7684\u552f\u4e00\u5b9e\u4f8b\u3002<\/li>\n\n\n\n<li><strong>\u5173\u6ce8\u70b9\u5206\u79bb<\/strong>\uff1a\u5c06\u5168\u5c40\u72b6\u6001\u7684\u7ba1\u7406\u96c6\u4e2d\u5728\u4e00\u4e2a\u5730\u65b9\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u4ee3\u7801\u793a\u4f8b\u4e0e\u6ce8\u91ca<\/strong>\uff1a <code>class ConfigManager { static #instance = null; \/\/ \u79c1\u6709\u9759\u6001\u5b57\u6bb5\uff0c\u5b58\u50a8\u552f\u4e00\u5b9e\u4f8b #config = {}; \/\/ \u79c1\u6709\u5b57\u6bb5\uff0c\u5b58\u50a8\u914d\u7f6e\u6570\u636e\/\/ \u79c1\u6709\u6784\u9020\u51fd\u6570\uff0c\u9632\u6b62\u5916\u90e8new constructor() { if (ConfigManager.#instance) { throw new Error('\u8bf7\u4f7f\u7528getInstance\u65b9\u6cd5\u83b7\u53d6\u5b9e\u4f8b'); } ConfigManager.#instance = this; } \/\/ \u5168\u5c40\u8bbf\u95ee\u70b9 static getInstance() { if (!ConfigManager.#instance) { ConfigManager.#instance = new ConfigManager(); } return ConfigManager.#instance; } set(key, value) { this.#config[key] = value; } get(key) { return this.#config[key]; }} \/\/ \u4f7f\u7528\u793a\u4f8b const config1 = ConfigManager.getInstance(); config1.set('theme', 'dark'); const config2 = ConfigManager.getInstance(); console.log(config2.get('theme')); \/\/ \u8f93\u51fa\uff1adark console.log(config1 === config2); \/\/ \u8f93\u51fa\uff1atrue\uff0c\u786e\u5b9e\u662f\u540c\u4e00\u4e2a\u5b9e\u4f8b \/\/ const config3 = new ConfigManager(); \/\/ \u62a5\u9519\uff1a\u8bf7\u4f7f\u7528getInstance\u65b9\u6cd5<\/code> <strong>\u6ce8\u91ca<\/strong>\uff1a\u5355\u4f8b\u6a21\u5f0f\u9700\u8c28\u614e\u4f7f\u7528\uff0c\u56e0\u4e3a\u5b83\u5f15\u5165\u4e86\u5168\u5c40\u72b6\u6001\uff0c\u53ef\u80fd\u589e\u52a0\u6a21\u5757\u95f4\u7684\u9690\u5f0f\u8026\u5408\uff0c\u4e0d\u5229\u4e8e\u6d4b\u8bd5\u3002\u5728JavaScript\u4e2d\uff0c\u6a21\u5757\u7cfb\u7edf\uff08ES6 Module\uff09\u672c\u8eab\u5c31\u63d0\u4f9b\u4e86\u5355\u4f8b\u7279\u6027\uff0c\u56e0\u6b64\u53ef\u80fd\u4e0d\u9700\u8981\u989d\u5916\u7684\u5355\u4f8b\u7c7b\u3002<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u56db\u3001\u7ed3\u6784\u578b\u6a21\u5f0f\uff1a\u7ec4\u5408\u5bf9\u8c61\u4ee5\u5f62\u6210\u66f4\u5927\u7684\u7ed3\u6784<\/strong><\/h2>\n\n\n\n<p><strong>\u6838\u5fc3\u601d\u60f3<\/strong>\uff1a\u901a\u8fc7\u7ec4\u5408\uff08\u800c\u975e\u7ee7\u627f\uff09\u6765\u6784\u5efa\u7075\u6d3b\u3001\u53ef\u590d\u7528\u7684\u7ed3\u6784\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>1. \u9002\u914d\u5668\u6a21\u5f0f\uff08Adapter\uff09<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u95ee\u9898<\/strong>\uff1a\u4e24\u4e2a\u5df2\u6709\u63a5\u53e3\u4e0d\u517c\u5bb9\uff0c\u4f46\u53c8\u9700\u8981\u4e00\u8d77\u5de5\u4f5c\u3002<\/li>\n\n\n\n<li><strong>\u89e3\u51b3\u65b9\u6848<\/strong>\uff1a\u521b\u5efa\u4e00\u4e2a\u9002\u914d\u5668\u7c7b\uff0c\u5305\u88c5\u4e0d\u517c\u5bb9\u7684\u5bf9\u8c61\uff0c\u63d0\u4f9b\u7edf\u4e00\u7684\u63a5\u53e3\u3002<\/li>\n\n\n\n<li><strong>\u8bbe\u8ba1\u539f\u5219\u4f53\u73b0<\/strong>\uff1a\n<ul class=\"wp-block-list\">\n<li><strong>\u5355\u4e00\u804c\u8d23\u539f\u5219<\/strong>\uff1a\u9002\u914d\u5668\u53ea\u8d1f\u8d23\u63a5\u53e3\u8f6c\u6362\u3002<\/li>\n\n\n\n<li><strong>\u5f00\u95ed\u539f\u5219<\/strong>\uff1a\u5ba2\u6237\u7aef\u53ef\u4ee5\u901a\u8fc7\u9002\u914d\u5668\u4f7f\u7528\u65b0\u63a5\u53e3\uff0c\u800c\u65e0\u9700\u4fee\u6539\u539f\u6709\u4ee3\u7801\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u4ee3\u7801\u793a\u4f8b\u4e0e\u6ce8\u91ca<\/strong>\uff1a<br><code>javascript \/\/ \u65e7\u7cfb\u7edf\uff1a\u5706\u5f62\u9489\uff0c\u6709\u7279\u5b9a\u7684\u534a\u5f84 class RoundPeg { constructor(radius) { this.radius = radius; } getRadius() { return this.radius; } } \/\/ \u65b0\u7cfb\u7edf\uff1a\u65b9\u5b54\uff0c\u53ea\u80fd\u63a5\u53d7\u65b9\u5f62\u9489 class SquareHole { constructor(width) { this.width = width; } fits(peg) { \/\/ \u671f\u671bpeg\u6709getWidth\u65b9\u6cd5\uff0c\u4f46RoundPeg\u6ca1\u6709 return peg.getWidth ? peg.getWidth() &lt;= this.width : false; } } \/\/ \u9002\u914d\u5668\uff1a\u8ba9\u5706\u5f62\u9489\u80fd\u9002\u914d\u65b9\u5b54 class SquarePegAdapter { constructor(roundPeg) { this.roundPeg = roundPeg; } \/\/ \u63d0\u4f9b\u65b9\u5b54\u671f\u671b\u7684getWidth\u65b9\u6cd5 getWidth() { \/\/ \u5c06\u5706\u5f62\u9489\u7684\u76f4\u5f84\u4f5c\u4e3a\u65b9\u5f62\u9489\u7684\u5bbd\u5ea6 return this.roundPeg.getRadius() * 2; } } \/\/ \u4f7f\u7528 const hole = new SquareHole(10); const roundPeg = new RoundPeg(5); \/\/ \u534a\u5f845\uff0c\u76f4\u5f8410 \/\/ hole.fits(roundPeg); \/\/ \u9519\u8bef\uff1aroundPeg\u6ca1\u6709getWidth\u65b9\u6cd5 const adapter = new SquarePegAdapter(roundPeg); console.log(hole.fits(adapter)); \/\/ \u8f93\u51fa\uff1atrue\uff0c\u9002\u914d\u6210\u529f<\/code><br>> <strong>\u6ce8\u91ca<\/strong>\uff1a\u9002\u914d\u5668\u6a21\u5f0f\u5e38\u7528\u4e8e\u6574\u5408\u9057\u7559\u4ee3\u7801\u3001\u7b2c\u4e09\u65b9\u5e93\u6216\u4e0d\u540cAPI\u3002\u5b83\u50cf\u4e00\u4e2a\u201c\u8f6c\u63a5\u5934\u201d\uff0c\u8ba9\u4e0d\u517c\u5bb9\u7684\u63a5\u53e3\u80fd\u591f\u534f\u4f5c\uff0c\u800c\u4e0d\u662f\u4fee\u6539\u5df2\u6709\u4ee3\u7801\uff0c\u8fd9\u7b26\u5408\u5f00\u95ed\u539f\u5219\u3002<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>2. \u88c5\u9970\u5668\u6a21\u5f0f\uff08Decorator\uff09<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u95ee\u9898<\/strong>\uff1a\u9700\u8981\u52a8\u6001\u5730\u4e3a\u5bf9\u8c61\u6dfb\u52a0\u65b0\u529f\u80fd\uff0c\u800c\u4e0d\u60f3\u901a\u8fc7\u7ee7\u627f\u589e\u52a0\u5b50\u7c7b\u3002<\/li>\n\n\n\n<li><strong>\u89e3\u51b3\u65b9\u6848<\/strong>\uff1a\u521b\u5efa\u4e00\u4e2a\u88c5\u9970\u5668\u7c7b\uff0c\u5305\u88c5\u539f\u59cb\u5bf9\u8c61\uff0c\u63d0\u4f9b\u76f8\u540c\u7684\u63a5\u53e3\u5e76\u6dfb\u52a0\u989d\u5916\u884c\u4e3a\u3002<\/li>\n\n\n\n<li><strong>\u8bbe\u8ba1\u539f\u5219\u4f53\u73b0<\/strong>\uff1a\n<ul class=\"wp-block-list\">\n<li><strong>\u5f00\u95ed\u539f\u5219<\/strong>\uff1a\u53ef\u4ee5\u52a8\u6001\u6dfb\u52a0\u529f\u80fd\uff0c\u65e0\u9700\u4fee\u6539\u539f\u6709\u5bf9\u8c61\u3002<\/li>\n\n\n\n<li><strong>\u5355\u4e00\u804c\u8d23\u539f\u5219<\/strong>\uff1a\u6bcf\u4e2a\u88c5\u9970\u5668\u7c7b\u53ea\u8d1f\u8d23\u4e00\u4e2a\u5177\u4f53\u7684\u529f\u80fd\u589e\u5f3a\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u4ee3\u7801\u793a\u4f8b\u4e0e\u6ce8\u91ca<\/strong>\uff1a <code>\/\/ \u57fa\u7840\u7ec4\u4ef6\u63a5\u53e3 class Coffee { cost() { return 5; } description() { return '\u666e\u901a\u5496\u5561'; } } \/\/ \u88c5\u9970\u5668\u57fa\u7c7b\uff08\u7ee7\u627f\u81ea\u76f8\u540c\u63a5\u53e3\uff09 class CoffeeDecorator { constructor(coffee) { this.coffee = coffee; } cost() { return this.coffee.cost(); } description() { return this.coffee.description(); } } \/\/ \u5177\u4f53\u88c5\u9970\u5668\uff1a\u52a0\u725b\u5976 class MilkDecorator extends CoffeeDecorator { cost() { return this.coffee.cost() + 2; } description() { return this.coffee.description() + '\uff0c\u52a0\u725b\u5976'; } } \/\/ \u5177\u4f53\u88c5\u9970\u5668\uff1a\u52a0\u7cd6 class SugarDecorator extends CoffeeDecorator { cost() { return this.coffee.cost() + 1; } description() { return this.coffee.description() + '\uff0c\u52a0\u7cd6'; } } \/\/ \u4f7f\u7528\uff1a\u52a8\u6001\u7ec4\u5408\u529f\u80fd let myCoffee = new Coffee(); console.log(myCoffee.description(), '\u4ef7\u683c\uff1a', myCoffee.cost()); \/\/ \u666e\u901a\u5496\u5561 \u4ef7\u683c\uff1a5 myCoffee = new MilkDecorator(myCoffee); console.log(myCoffee.description(), '\u4ef7\u683c\uff1a', myCoffee.cost()); \/\/ \u666e\u901a\u5496\u5561\uff0c\u52a0\u725b\u5976 \u4ef7\u683c\uff1a7 myCoffee = new SugarDecorator(myCoffee); console.log(myCoffee.description(), '\u4ef7\u683c\uff1a', myCoffee.cost()); \/\/ \u666e\u901a\u5496\u5561\uff0c\u52a0\u725b\u5976\uff0c\u52a0\u7cd6 \u4ef7\u683c\uff1a8 \/\/ \u53ef\u4ee5\u4efb\u610f\u7ec4\u5408\uff0c\u4e14\u987a\u5e8f\u53ef\u8c03 let anotherCoffee = new SugarDecorator(new MilkDecorator(new Coffee())); console.log(anotherCoffee.description()); \/\/ \u666e\u901a\u5496\u5561\uff0c\u52a0\u725b\u5976\uff0c\u52a0\u7cd6<\/code> <strong>\u6ce8\u91ca<\/strong>\uff1a\u88c5\u9970\u5668\u6a21\u5f0f\u63d0\u4f9b\u4e86\u6bd4\u7ee7\u627f\u66f4\u7075\u6d3b\u7684\u529f\u80fd\u6269\u5c55\u65b9\u5f0f\u3002\u6bcf\u4e2a\u88c5\u9970\u5668\u90fd\u662f\u4e00\u4e2a\u72ec\u7acb\u7684\u3001\u53ef\u590d\u7528\u7684\u7ec4\u4ef6\u3002JavaScript\u4e2d\u7684\u9ad8\u9636\u51fd\u6570\uff08\u51fd\u6570\u88c5\u9970\u5668\uff09\u548cES7\u7684\u88c5\u9970\u5668\u8bed\u6cd5\uff08<code>@decorator<\/code>\uff09\u90fd\u662f\u8fd9\u4e00\u601d\u60f3\u7684\u4f53\u73b0\u3002\u8fd9\u5b8c\u7f8e\u7b26\u5408\u5f00\u95ed\u539f\u5219\u2014\u2014\u5bf9\u6269\u5c55\u5f00\u653e\uff08\u6dfb\u52a0\u65b0\u88c5\u9970\u5668\uff09\uff0c\u5bf9\u4fee\u6539\u5173\u95ed\uff08\u4e0d\u4fee\u6539\u539f\u7ec4\u4ef6\uff09\u3002<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u4e94\u3001\u884c\u4e3a\u578b\u6a21\u5f0f\uff1a\u4f18\u5316\u5bf9\u8c61\u95f4\u7684\u901a\u4fe1\u4e0e\u804c\u8d23\u5206\u914d<\/strong><\/h2>\n\n\n\n<p><strong>\u6838\u5fc3\u601d\u60f3<\/strong>\uff1a\u5173\u6ce8\u5bf9\u8c61\u5982\u4f55\u534f\u4f5c\u5b8c\u6210\u590d\u6742\u4efb\u52a1\uff0c\u4ee5\u53ca\u5982\u4f55\u5206\u914d\u804c\u8d23\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>1. \u89c2\u5bdf\u8005\u6a21\u5f0f\uff08Observer\uff09<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u95ee\u9898<\/strong>\uff1a\u5f53\u4e00\u4e2a\u5bf9\u8c61\uff08\u4e3b\u9898\uff09\u7684\u72b6\u6001\u53d8\u5316\u9700\u8981\u901a\u77e5\u591a\u4e2a\u5176\u4ed6\u5bf9\u8c61\uff08\u89c2\u5bdf\u8005\uff09\uff0c\u4e14\u89c2\u5bdf\u8005\u6570\u91cf\u548c\u7c7b\u578b\u53ef\u80fd\u53d8\u5316\u3002<\/li>\n\n\n\n<li><strong>\u89e3\u51b3\u65b9\u6848<\/strong>\uff1a\u5b9a\u4e49\u4e00\u79cd\u8ba2\u9605\u673a\u5236\uff0c\u5141\u8bb8\u89c2\u5bdf\u8005\u8ba2\u9605\u4e3b\u9898\uff0c\u5f53\u4e3b\u9898\u72b6\u6001\u53d8\u5316\u65f6\u81ea\u52a8\u901a\u77e5\u6240\u6709\u89c2\u5bdf\u8005\u3002<\/li>\n\n\n\n<li><strong>\u8bbe\u8ba1\u539f\u5219\u4f53\u73b0<\/strong>\uff1a\n<ul class=\"wp-block-list\">\n<li><strong>\u5f00\u95ed\u539f\u5219<\/strong>\uff1a\u53ef\u4ee5\u8f7b\u677e\u6dfb\u52a0\u65b0\u7684\u89c2\u5bdf\u8005\uff0c\u65e0\u9700\u4fee\u6539\u4e3b\u9898\u3002<\/li>\n\n\n\n<li><strong>\u677e\u8026\u5408<\/strong>\uff1a\u4e3b\u9898\u548c\u89c2\u5bdf\u8005\u4e4b\u95f4\u53ea\u6709\u62bd\u8c61\u7684\u4f9d\u8d56\u5173\u7cfb\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u4ee3\u7801\u793a\u4f8b\u4e0e\u6ce8\u91ca<\/strong>\uff1a<br><code>javascript \/\/ \u4e3b\u9898\uff08\u88ab\u89c2\u5bdf\u8005\uff09 class WeatherStation { constructor() { this.temperature = 0; this.observers = []; \/\/ \u89c2\u5bdf\u8005\u5217\u8868 } \/\/ \u8ba2\u9605\u65b9\u6cd5 subscribe(observer) { this.observers.push(observer); } \/\/ \u53d6\u6d88\u8ba2\u9605 unsubscribe(observer) { this.observers = this.observers.filter(obs => obs !== observer); } \/\/ \u901a\u77e5\u6240\u6709\u89c2\u5bdf\u8005 notify() { this.observers.forEach(observer => observer.update(this.temperature)); } \/\/ \u4e1a\u52a1\u65b9\u6cd5\uff1a\u6e29\u5ea6\u53d8\u5316\u65f6\u81ea\u52a8\u901a\u77e5 setTemperature(temp) { this.temperature = temp; this.notify(); } } \/\/ \u89c2\u5bdf\u8005\u63a5\u53e3 class Display { update(temperature) { throw new Error('\u5b50\u7c7b\u5fc5\u987b\u5b9e\u73b0update\u65b9\u6cd5'); } } \/\/ \u5177\u4f53\u89c2\u5bdf\u8005 class PhoneDisplay extends Display { constructor(name) { super(); this.name = name; } update(temperature) { console.log(`[${this.name}] \u5f53\u524d\u6e29\u5ea6\uff1a${temperature}\u00b0C`); } } \/\/ \u4f7f\u7528 const station = new WeatherStation(); const phone1 = new PhoneDisplay('\u5f20\u4e09\u7684\u624b\u673a'); const phone2 = new PhoneDisplay('\u674e\u56db\u7684\u624b\u673a'); station.subscribe(phone1); station.subscribe(phone2); station.setTemperature(25); \/\/ \u8f93\u51fa\uff1a[\u5f20\u4e09\u7684\u624b\u673a] \u5f53\u524d\u6e29\u5ea6\uff1a25\u00b0C \/\/ [\u674e\u56db\u7684\u624b\u673a] \u5f53\u524d\u6e29\u5ea6\uff1a25\u00b0C station.unsubscribe(phone1); station.setTemperature(30); \/\/ \u53ea\u8f93\u51fa\uff1a[\u674e\u56db\u7684\u624b\u673a] \u5f53\u524d\u6e29\u5ea6\uff1a30\u00b0C<\/code><br>> <strong>\u6ce8\u91ca<\/strong>\uff1a\u89c2\u5bdf\u8005\u6a21\u5f0f\u662f\u4e8b\u4ef6\u9a71\u52a8\u7cfb\u7edf\u7684\u57fa\u77f3\uff0c\u5b9e\u73b0\u4e86\u5bf9\u8c61\u95f4\u7684\u677e\u8026\u5408\u901a\u4fe1\u3002\u4e3b\u9898\u4e0d\u77e5\u9053\u4e5f\u4e0d\u5173\u5fc3\u89c2\u5bdf\u8005\u7684\u5177\u4f53\u5b9e\u73b0\uff0c\u53ea\u8d1f\u8d23\u901a\u77e5\u3002\u8fd9\u4e0e\u7b2c60\u8bfe\u7684\u95ed\u5305\u6709\u8054\u7cfb\uff1a\u89c2\u5bdf\u8005\u7684\u56de\u8c03\u51fd\u6570\u5e38\u5e38\u5f62\u6210\u95ed\u5305\uff0c\u6355\u83b7\u4e86\u5b9a\u4e49\u65f6\u7684\u4e0a\u4e0b\u6587\u3002\u8fd9\u79cd\u6a21\u5f0f\u5728\u524d\u7aef\u6846\u67b6\uff08\u5982React\u7684\u72b6\u6001\u7ba1\u7406\u3001Vue\u7684\u54cd\u5e94\u5f0f\u7cfb\u7edf\uff09\u548c\u540e\u7aef\u7684\u4e8b\u4ef6\u7cfb\u7edf\u4e2d\u5e7f\u6cdb\u5e94\u7528\u3002<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>2. \u7b56\u7565\u6a21\u5f0f\uff08Strategy\uff09<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u95ee\u9898<\/strong>\uff1a\u4e00\u4e2a\u4efb\u52a1\u6709\u591a\u79cd\u7b97\u6cd5\u5b9e\u73b0\uff0c\u9700\u8981\u5728\u8fd0\u884c\u65f6\u52a8\u6001\u9009\u62e9\u3002<\/li>\n\n\n\n<li><strong>\u89e3\u51b3\u65b9\u6848<\/strong>\uff1a\u5c06\u6bcf\u79cd\u7b97\u6cd5\u5c01\u88c5\u6210\u72ec\u7acb\u7684\u7b56\u7565\u7c7b\uff0c\u5e76\u4f7f\u5b83\u4eec\u53ef\u4ee5\u4e92\u76f8\u66ff\u6362\u3002<\/li>\n\n\n\n<li><strong>\u8bbe\u8ba1\u539f\u5219\u4f53\u73b0<\/strong>\uff1a\n<ul class=\"wp-block-list\">\n<li><strong>\u5f00\u95ed\u539f\u5219<\/strong>\uff1a\u6dfb\u52a0\u65b0\u7b56\u7565\u65f6\u65e0\u9700\u4fee\u6539\u4e0a\u4e0b\u6587\u3002<\/li>\n\n\n\n<li><strong>\u5355\u4e00\u804c\u8d23\u539f\u5219<\/strong>\uff1a\u6bcf\u79cd\u7b56\u7565\u53ea\u8d1f\u8d23\u4e00\u79cd\u7b97\u6cd5\u3002<\/li>\n\n\n\n<li><strong>\u4f9d\u8d56\u5012\u7f6e\u539f\u5219<\/strong>\uff1a\u4e0a\u4e0b\u6587\u4f9d\u8d56\u62bd\u8c61\u7684\u7b56\u7565\u63a5\u53e3\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u4ee3\u7801\u793a\u4f8b\u4e0e\u6ce8\u91ca<\/strong>\uff1a<br><code>javascript \/\/ \u7b56\u7565\u63a5\u53e3 class PaymentStrategy { pay(amount) { throw new Error('\u5b50\u7c7b\u5fc5\u987b\u5b9e\u73b0pay\u65b9\u6cd5'); } } \/\/ \u5177\u4f53\u7b56\u7565 class CreditCardStrategy extends PaymentStrategy { constructor(cardNumber, cvv) { super(); this.cardNumber = cardNumber; this.cvv = cvv; } pay(amount) { console.log(`\u4f7f\u7528\u4fe1\u7528\u5361\u652f\u4ed8 ${amount} \u5143\uff0c\u5361\u53f7\uff1a${this.cardNumber}`); \/\/ \u5b9e\u9645\u4f1a\u8c03\u7528\u94f6\u884cAPI } } class AlipayStrategy extends PaymentStrategy { constructor(email) { super(); this.email = email; } pay(amount) { console.log(`\u4f7f\u7528\u652f\u4ed8\u5b9d\u652f\u4ed8 ${amount} \u5143\uff0c\u8d26\u6237\uff1a${this.email}`); \/\/ \u5b9e\u9645\u4f1a\u8c03\u7528\u652f\u4ed8\u5b9dAPI } } \/\/ \u4e0a\u4e0b\u6587\uff08\u4f7f\u7528\u7b56\u7565\u7684\u7c7b\uff09 class ShoppingCart { constructor() { this.items = []; this.paymentStrategy = null; } addItem(item, price) { this.items.push({ item, price }); } setPaymentStrategy(strategy) { this.paymentStrategy = strategy; } checkout() { const total = this.items.reduce((sum, item) => sum + item.price, 0); if (!this.paymentStrategy) { throw new Error('\u8bf7\u5148\u8bbe\u7f6e\u652f\u4ed8\u65b9\u5f0f'); } this.paymentStrategy.pay(total); this.items = []; \/\/ \u6e05\u7a7a\u8d2d\u7269\u8f66 } } \/\/ \u4f7f\u7528 const cart = new ShoppingCart(); cart.addItem('\u4e66\u7c4d', 50); cart.addItem('\u9f20\u6807', 100); \/\/ \u8fd0\u884c\u65f6\u52a8\u6001\u9009\u62e9\u7b56\u7565 if (userPrefers === 'creditCard') { cart.setPaymentStrategy(new CreditCardStrategy('1234-5678', '123')); } else { cart.setPaymentStrategy(new AlipayStrategy('user@example.com')); } cart.checkout(); \/\/ \u6839\u636e\u9009\u62e9\u8c03\u7528\u76f8\u5e94\u652f\u4ed8\u7b56\u7565<\/code><br>> <strong>\u6ce8\u91ca<\/strong>\uff1a\u7b56\u7565\u6a21\u5f0f\u5c06\u7b97\u6cd5\u4e0e\u4f7f\u7528\u5b83\u7684\u5ba2\u6237\u7aef\u89e3\u8026\uff0c\u4f7f\u5f97\u7b97\u6cd5\u53ef\u4ee5\u72ec\u7acb\u53d8\u5316\u3002\u8fd9\u4e0e\u95ed\u5305\u6709\u6709\u8da3\u7684\u8054\u7cfb\uff1a\u5728JavaScript\u4e2d\uff0c\u7b56\u7565\u5e38\u5e38\u53ef\u4ee5\u7528\u7b80\u5355\u7684\u9ad8\u9636\u51fd\u6570\uff08\u95ed\u5305\uff09\u6765\u5b9e\u73b0\uff0c\u800c\u975e\u5b8c\u6574\u7684\u7c7b\u3002\u4f8b\u5982\uff0c\u6392\u5e8f\u51fd\u6570<code>Array.prototype.sort<\/code>\u63a5\u53d7\u7684\u6bd4\u8f83\u51fd\u6570\u5c31\u662f\u4e00\u79cd\u7b56\u7565\u6a21\u5f0f\u7684\u8f7b\u91cf\u7ea7\u5b9e\u73b0\u3002<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u516d\u3001\u6a21\u5f0f\u95f4\u7684\u8054\u7cfb\u4e0e\u7ec4\u5408\u4f7f\u7528<\/strong><\/h2>\n\n\n\n<p>\u5728\u5b9e\u9645\u7cfb\u7edf\u4e2d\uff0c\u8bbe\u8ba1\u6a21\u5f0f\u5f80\u5f80\u4e0d\u662f\u5b64\u7acb\u5b58\u5728\u7684\u3002\u4f8b\u5982\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>MVC\u67b6\u6784<\/strong>\uff1a\u7ed3\u5408\u4e86\u89c2\u5bdf\u8005\uff08Model\u4e0eView\uff09\u3001\u7b56\u7565\uff08Controller\u884c\u4e3a\uff09\u548c\u7ec4\u5408\uff08View\u5c42\u6b21\uff09\u7b49\u591a\u79cd\u6a21\u5f0f\u3002<\/li>\n\n\n\n<li><strong>\u4e00\u4e2a\u7535\u5546\u7cfb\u7edf<\/strong>\uff1a\u53ef\u80fd\u4f7f\u7528\u5de5\u5382\u65b9\u6cd5\u521b\u5efa\u8ba2\u5355\u3001\u88c5\u9970\u5668\u6dfb\u52a0\u6298\u6263\u3001\u7b56\u7565\u5904\u7406\u652f\u4ed8\u3001\u89c2\u5bdf\u8005\u901a\u77e5\u7269\u6d41\u3002<\/li>\n<\/ul>\n\n\n\n<p><strong>\u91cd\u8981\u63d0\u9192<\/strong>\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u4e0d\u8981\u8fc7\u5ea6\u8bbe\u8ba1<\/strong>\uff1a\u6a21\u5f0f\u4e3a\u89e3\u51b3\u7279\u5b9a\u95ee\u9898\u800c\u751f\uff0c\u5982\u679c\u95ee\u9898\u4e0d\u5b58\u5728\uff0c\u5f3a\u884c\u5e94\u7528\u6a21\u5f0f\u53ea\u4f1a\u589e\u52a0\u590d\u6742\u5ea6\uff08\u8fdd\u53cdKISS\u539f\u5219\uff09\u3002<\/li>\n\n\n\n<li><strong>\u6a21\u5f0f\u662f\u6307\u5bfc\u601d\u60f3\uff0c\u4e0d\u662f\u6559\u6761<\/strong>\uff1a\u53ef\u4ee5\u6839\u636e\u5177\u4f53\u8bed\u8a00\u7279\u6027\u7b80\u5316\u5b9e\u73b0\uff08\u5982JavaScript\u4e2d\u5e38\u7528\u51fd\u6570\u548c\u5bf9\u8c61\u66ff\u4ee3\u5b8c\u6574\u7684\u7c7b\u5c42\u6b21\uff09\u3002<\/li>\n\n\n\n<li><strong>\u7406\u89e3\u6bd4\u8bb0\u5fc6\u66f4\u91cd\u8981<\/strong>\uff1a\u638c\u63e1\u6bcf\u4e2a\u6a21\u5f0f\u7684<strong>\u610f\u56fe<\/strong>\u3001<strong>\u9002\u7528\u573a\u666f<\/strong>\u548c<strong>\u4f18\u7f3a\u70b9<\/strong>\uff0c\u6bd4\u6b7b\u8bb0UML\u56fe\u66f4\u6709\u4ef7\u503c\u3002<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u4e03\u3001\u603b\u7ed3\u4e0e\u5c55\u671b<\/strong><\/h2>\n\n\n\n<p>\u4ece\u8bbe\u8ba1\u539f\u5219\u5230\u8bbe\u8ba1\u6a21\u5f0f\uff0c\u4f60\u5df2\u5efa\u7acb\u8d77\u4ece\u5b8f\u89c2\u6307\u5bfc\u601d\u60f3\u5230\u5fae\u89c2\u89e3\u51b3\u65b9\u6848\u7684\u5b8c\u6574\u77e5\u8bc6\u94fe\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u8bbe\u8ba1\u539f\u5219<\/strong>\uff08\u7b2c61\u8bfe\uff09\u63d0\u4f9b\u4e86\u8bc4\u4ef7\u8bbe\u8ba1\u7684\u201c\u4ef7\u503c\u89c2\u201d\u548c\u201c\u8d28\u91cf\u6807\u51c6\u201d\u3002<\/li>\n\n\n\n<li><strong>\u8bbe\u8ba1\u6a21\u5f0f<\/strong>\uff08\u672c\u8bfe\uff09\u63d0\u4f9b\u4e86\u5b9e\u73b0\u8fd9\u4e9b\u539f\u5219\u7684\u201c\u5de5\u5177\u7bb1\u201d\u548c\u201c\u6700\u4f73\u5b9e\u8df5\u201d\u3002<\/li>\n<\/ol>\n\n\n\n<p>\u8fd9\u4e09\u7c7b\u6a21\u5f0f\u5171\u540c\u89e3\u51b3\u4e86\u9762\u5411\u5bf9\u8c61\u8bbe\u8ba1\u4e2d\u7684\u6838\u5fc3\u6311\u6218\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u521b\u5efa\u578b\u6a21\u5f0f<\/strong>\u8ba9\u4f60\u66f4\u7075\u6d3b\u5730\u521b\u5efa\u5bf9\u8c61\uff08\u89e3\u51b3\u201c\u5bf9\u8c61\u4ece\u54ea\u91cc\u6765\u201d\uff09<\/li>\n\n\n\n<li><strong>\u7ed3\u6784\u578b\u6a21\u5f0f<\/strong>\u8ba9\u4f60\u66f4\u4f18\u96c5\u5730\u7ec4\u5408\u5bf9\u8c61\uff08\u89e3\u51b3\u201c\u5bf9\u8c61\u5982\u4f55\u7ec4\u7ec7\u201d\uff09<\/li>\n\n\n\n<li><strong>\u884c\u4e3a\u578b\u6a21\u5f0f<\/strong>\u8ba9\u4f60\u66f4\u667a\u80fd\u5730\u534f\u8c03\u5bf9\u8c61\uff08\u89e3\u51b3\u201c\u5bf9\u8c61\u5982\u4f55\u4e92\u52a8\u201d\uff09<\/li>\n<\/ul>\n\n\n\n<p><strong>\u8fdb\u9636\u65b9\u5411<\/strong>\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u5b66\u4e60\u66f4\u591a\u6a21\u5f0f<\/strong>\uff1a\u5982\u539f\u578b\u6a21\u5f0f\u3001\u4ee3\u7406\u6a21\u5f0f\u3001\u8d23\u4efb\u94fe\u6a21\u5f0f\u3001\u8bbf\u95ee\u8005\u6a21\u5f0f\u7b49\u3002<\/li>\n\n\n\n<li><strong>\u7814\u7a76\u67b6\u6784\u6a21\u5f0f<\/strong>\uff1a\u5982MVC\u3001MVVM\u3001\u5fae\u670d\u52a1\u3001\u4e8b\u4ef6\u9a71\u52a8\u67b6\u6784\u7b49\u66f4\u9ad8\u5c42\u6b21\u7684\u6a21\u5f0f\u3002<\/li>\n\n\n\n<li><strong>\u7406\u89e3\u53cd\u6a21\u5f0f<\/strong>\uff1a\u8bc6\u522b\u5e38\u89c1\u7684\u4e0d\u826f\u8bbe\u8ba1\u6a21\u5f0f\uff0c\u907f\u514d\u91cd\u8e48\u8986\u8f99\u3002<\/li>\n<\/ul>\n\n\n\n<p>\u8bb0\u4f4f\uff0c\u8bbe\u8ba1\u6a21\u5f0f\u7684\u6700\u7ec8\u76ee\u6807\u662f<strong>\u5199\u51fa\u53ef\u8bfb\u3001\u53ef\u7ef4\u62a4\u3001\u53ef\u6269\u5c55\u7684\u4ee3\u7801<\/strong>\u3002\u5f53\u4f60\u9762\u4e34\u8bbe\u8ba1\u6289\u62e9\u65f6\uff0c\u95ee\u81ea\u5df1\uff1a\u8fd9\u4e2a\u65b9\u6848\u662f\u5426\u9075\u5faa\u4e86\u8bbe\u8ba1\u539f\u5219\uff1f\u662f\u5426\u6709\u5408\u9002\u7684\u6a21\u5f0f\u53ef\u4ee5\u501f\u9274\uff1f<\/p>\n\n\n\n<p>\u8bbe\u8ba1\u6a21\u5f0f\u7684\u5b66\u4e60\u662f\u4e00\u4e2a\u6301\u7eed\u7684\u8fc7\u7a0b\uff0c\u968f\u7740\u7ecf\u9a8c\u7684\u79ef\u7d2f\uff0c\u4f60\u4f1a\u9010\u6e10\u5f62\u6210\u81ea\u5df1\u7684\u201c\u6a21\u5f0f\u55c5\u89c9\u201d\u2014\u2014\u80fd\u591f\u81ea\u7136\u5730\u5728\u5408\u9002\u7684\u573a\u666f\u5e94\u7528\u5408\u9002\u7684\u6a21\u5f0f\uff0c\u8fd9\u624d\u662f\u771f\u6b63\u7684\u638c\u63e1\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u7b2c63\u8bfe\uff1a\u7f16\u7a0b\u8303\u5f0f\u4e0e\u601d\u7ef4\u65b9\u5f0f \u2014\u2014 \u51fd\u6570\u5f0f\u7f16\u7a0b\u4e0e\u54cd\u5e94\u5f0f\u7f16\u7a0b<\/strong><\/h2>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u4e00\u3001\u4e3a\u4ec0\u4e48\u5728&#8221;\u8bbe\u8ba1\u6a21\u5f0f&#8221;\u4e4b\u540e\u8ba8\u8bba&#8221;\u7f16\u7a0b\u8303\u5f0f&#8221;\uff1f<\/strong><\/h2>\n\n\n\n<p>\u7ecf\u8fc7\u524d\u4e24\u8bfe\u7684\u5b66\u4e60\uff0c\u4f60\u638c\u63e1\u4e86\u5982\u4f55\u5e94\u7528\u8bbe\u8ba1\u539f\u5219\u6765\u6307\u5bfc\u4ee3\u7801\u7ed3\u6784\uff08\u7b2c61\u8bfe\uff09\uff0c\u4ee5\u53ca\u5982\u4f55\u4f7f\u7528\u5177\u4f53\u7684\u8bbe\u8ba1\u6a21\u5f0f\u89e3\u51b3\u5e38\u89c1\u95ee\u9898\uff08\u7b2c62\u8bfe\uff09\u3002\u73b0\u5728\uff0c\u8ba9\u6211\u4eec\u628a\u89c6\u91ce\u63d0\u5347\u5230\u4e00\u4e2a\u66f4\u9ad8\u7684\u5c42\u6b21\uff1a<strong>\u7f16\u7a0b\u8303\u5f0f\u4e0e\u601d\u7ef4\u65b9\u5f0f<\/strong>\u3002<\/p>\n\n\n\n<p>\u5982\u679c\u8bf4\u8bbe\u8ba1\u6a21\u5f0f\u662f\u89e3\u51b3\u7279\u5b9a\u95ee\u9898\u7684&#8221;\u5de5\u5177\u5305&#8221;\uff0c\u90a3\u4e48\u7f16\u7a0b\u8303\u5f0f\u5c31\u662f<strong>\u6307\u5bfc\u6211\u4eec\u5982\u4f55\u601d\u8003\u95ee\u9898\u3001\u7ec4\u7ec7\u4ee3\u7801\u7684&#8221;\u4e16\u754c\u89c2&#8221;\u548c&#8221;\u65b9\u6cd5\u8bba&#8221;<\/strong>\u3002\u4e0d\u540c\u7684\u7f16\u7a0b\u8303\u5f0f\u4ee3\u8868\u4e86\u4e0d\u540c\u7684\u601d\u7ef4\u6a21\u578b\uff0c\u5b83\u4eec\u4ece\u6839\u672c\u4e0a\u5f71\u54cd\u6211\u4eec\u5982\u4f55\u8bbe\u8ba1\u8f6f\u4ef6\u3002<\/p>\n\n\n\n<p><strong>\u5173\u952e\u6d1e\u5bdf<\/strong>\uff1a\u7f16\u7a0b\u8303\u5f0f\u4e0d\u4ec5\u4ec5\u662f\u8bed\u6cd5\u7279\u6027\uff0c\u66f4\u662f<strong>\u89e3\u51b3\u95ee\u9898\u7684\u4e0d\u540c\u601d\u7ef4\u65b9\u5f0f<\/strong>\u3002\u638c\u63e1\u591a\u79cd\u8303\u5f0f\u80fd\u8ba9\u4f60\u5728\u9762\u5bf9\u95ee\u9898\u65f6\u62e5\u6709\u66f4\u591a\u89c6\u89d2\uff0c\u9009\u62e9\u6700\u9002\u5408\u7684\u5de5\u5177\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u4e8c\u3001\u4ec0\u4e48\u662f\u7f16\u7a0b\u8303\u5f0f\uff1f<\/strong><\/h2>\n\n\n\n<p>\u7f16\u7a0b\u8303\u5f0f\u662f<strong>\u4e00\u5957\u5173\u4e8e\u5982\u4f55\u6784\u5efa\u548c\u7406\u89e3\u7a0b\u5e8f\u7684\u57fa\u672c\u7406\u5ff5\u548c\u539f\u5219<\/strong>\u3002\u5b83\u5b9a\u4e49\u4e86\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u5982\u4f55\u770b\u5f85\u6570\u636e\u548c\u64cd\u4f5c<\/strong>\uff1a\u662f\u4f5c\u4e3a\u53ef\u53d8\u72b6\u6001\u8fd8\u662f\u4e0d\u53ef\u53d8\u503c\uff1f<\/li>\n\n\n\n<li><strong>\u5982\u4f55\u7ec4\u7ec7\u8ba1\u7b97<\/strong>\uff1a\u662f\u4f5c\u4e3a\u4e00\u7cfb\u5217\u72b6\u6001\u8f6c\u6362\u8fd8\u662f\u8868\u8fbe\u5f0f\u6c42\u503c\uff1f<\/li>\n\n\n\n<li><strong>\u5982\u4f55\u7ec4\u5408\u529f\u80fd<\/strong>\uff1a\u662f\u901a\u8fc7\u5bf9\u8c61\u7ec4\u5408\u8fd8\u662f\u51fd\u6570\u7ec4\u5408\uff1f<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\u4e3b\u8981\u7f16\u7a0b\u8303\u5f0f\u6982\u89c8<\/strong><\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u547d\u4ee4\u5f0f\u7f16\u7a0b<\/strong>\uff1a\u63cf\u8ff0&#8221;\u5982\u4f55\u505a&#8221;\uff08How\uff09\uff0c\u901a\u8fc7\u4e00\u7cfb\u5217\u6307\u4ee4\u6539\u53d8\u7a0b\u5e8f\u72b6\u6001\u3002<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u8fc7\u7a0b\u5f0f\u7f16\u7a0b<\/strong>\uff1a\u57fa\u4e8e\u8fc7\u7a0b\/\u51fd\u6570\u7684\u6307\u4ee4\u5e8f\u5217\uff08\u5982C\u3001Pascal\uff09\u3002<\/li>\n\n\n\n<li><strong>\u9762\u5411\u5bf9\u8c61\u7f16\u7a0b<\/strong>\uff1a\u57fa\u4e8e\u5bf9\u8c61\u548c\u7c7b\u7684\u6307\u4ee4\u5e8f\u5217\uff08\u5982Java\u3001C++\u3001Python\uff09\u3002<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u58f0\u660e\u5f0f\u7f16\u7a0b<\/strong>\uff1a\u63cf\u8ff0&#8221;\u505a\u4ec0\u4e48&#8221;\uff08What\uff09\uff0c\u800c\u975e&#8221;\u5982\u4f55\u505a&#8221;\u3002<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u51fd\u6570\u5f0f\u7f16\u7a0b<\/strong>\uff1a\u57fa\u4e8e\u6570\u5b66\u51fd\u6570\u548c\u8868\u8fbe\u5f0f\u6c42\u503c\u3002<\/li>\n\n\n\n<li><strong>\u903b\u8f91\u7f16\u7a0b<\/strong>\uff1a\u57fa\u4e8e\u903b\u8f91\u89c4\u5219\u548c\u63a8\u7406\uff08\u5982Prolog\uff09\u3002<\/li>\n\n\n\n<li><strong>\u54cd\u5e94\u5f0f\u7f16\u7a0b<\/strong>\uff1a\u57fa\u4e8e\u6570\u636e\u6d41\u548c\u53d8\u5316\u4f20\u64ad\u3002<\/li>\n<\/ul>\n\n\n\n<p><strong>\u91cd\u8981\u5173\u7cfb<\/strong>\uff1a\u547d\u4ee4\u5f0f\u7f16\u7a0b\u5173\u6ce8<strong>\u63a7\u5236\u6d41<\/strong>\uff0c\u58f0\u660e\u5f0f\u7f16\u7a0b\u5173\u6ce8<strong>\u6570\u636e\u6d41<\/strong>\u3002\u8fd9\u79cd\u6839\u672c\u5dee\u5f02\u5bfc\u81f4\u4e86\u5b8c\u5168\u4e0d\u540c\u7684\u8bbe\u8ba1\u548c\u601d\u8003\u65b9\u5f0f\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u4e09\u3001\u51fd\u6570\u5f0f\u7f16\u7a0b\uff08Functional Programming\uff0cFP\uff09<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>1. \u6838\u5fc3\u601d\u60f3\uff1a\u6570\u5b66\u51fd\u6570\u4f5c\u4e3a\u4e00\u7b49\u516c\u6c11<\/strong><\/h3>\n\n\n\n<p>\u51fd\u6570\u5f0f\u7f16\u7a0b\u5c06\u8ba1\u7b97\u89c6\u4e3a<strong>\u6570\u5b66\u51fd\u6570\u7684\u6c42\u503c<\/strong>\uff0c\u907f\u514d\u72b6\u6001\u6539\u53d8\u548c\u53ef\u53d8\u6570\u636e\u3002\u5b83\u7684\u6838\u5fc3\u539f\u5219\u6765\u81ea\u4e8e\u03bb\u6f14\u7b97\uff08Lambda Calculus\uff09\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>2. \u51fd\u6570\u5f0f\u7f16\u7a0b\u7684\u6838\u5fc3\u6982\u5ff5<\/strong><\/h3>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>a. \u7eaf\u51fd\u6570\uff08Pure Functions\uff09<\/strong><\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u662f\u4ec0\u4e48<\/strong>\uff1a\u7ed9\u5b9a\u76f8\u540c\u8f93\u5165\uff0c\u603b\u662f\u8fd4\u56de\u76f8\u540c\u8f93\u51fa\uff0c\u4e14\u6ca1\u6709\u526f\u4f5c\u7528\u3002<\/li>\n\n\n\n<li><strong>\u4e3a\u4ec0\u4e48\u91cd\u8981<\/strong>\uff1a\u7eaf\u51fd\u6570\u6613\u4e8e\u63a8\u7406\u3001\u6d4b\u8bd5\u3001\u5e76\u884c\u5316\uff0c\u4e14\u5177\u6709\u5f15\u7528\u900f\u660e\u6027\u3002<\/li>\n\n\n\n<li><strong>\u793a\u4f8b\u4e0e\u6ce8\u91ca<\/strong>\uff1a <code>\/\/ \u4e0d\u7eaf\u7684\u51fd\u6570\uff1a\u6709\u526f\u4f5c\u7528\uff0c\u8f93\u51fa\u4f9d\u8d56\u5916\u90e8\u72b6\u6001 let taxRate = 0.1; function calculateTaxImpure(price) { console.log(`\u8ba1\u7b97\u7a0e\u6b3e...`); \/\/ \u526f\u4f5c\u75281\uff1a\u63a7\u5236\u53f0\u8f93\u51fa return price * taxRate; \/\/ \u526f\u4f5c\u75282\uff1a\u4f9d\u8d56\u5916\u90e8\u53d8\u91cf } \/\/ \u7eaf\u51fd\u6570\uff1a\u65e0\u526f\u4f5c\u7528\uff0c\u53ea\u4f9d\u8d56\u8f93\u5165\u53c2\u6570 function calculateTaxPure(price, rate) { return price * rate; } \/\/ \u4f7f\u7528 console.log(calculateTaxPure(100, 0.1)); \/\/ \u603b\u662f\u8fd4\u56de10 console.log(calculateTaxPure(100, 0.1)); \/\/ \u603b\u662f\u8fd4\u56de10\uff0c\u53ef\u9884\u6d4b\uff01<\/code> <strong>\u6ce8\u91ca<\/strong>\uff1a\u7eaf\u51fd\u6570\u662f\u51fd\u6570\u5f0f\u7f16\u7a0b\u7684\u57fa\u77f3\u3002\u5b83\u4eec\u50cf\u6570\u5b66\u51fd\u6570\u4e00\u6837\u5de5\u4f5c\uff1a<code>f(x) = x\u00b2<\/code>\u3002\u65e0\u8bba\u4f55\u65f6\u8c03\u7528<code>f(5)<\/code>\uff0c\u7ed3\u679c\u603b\u662f25\u3002\u8fd9\u79cd\u53ef\u9884\u6d4b\u6027\u4f7f\u4ee3\u7801\u66f4\u53ef\u9760\u3001\u66f4\u6613\u4e8e\u7ef4\u62a4\u3002<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>b. \u4e0d\u53ef\u53d8\u6027\uff08Immutability\uff09<\/strong><\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u662f\u4ec0\u4e48<\/strong>\uff1a\u6570\u636e\u4e00\u65e6\u521b\u5efa\u5c31\u4e0d\u80fd\u88ab\u4fee\u6539\u3002\u4efb\u4f55&#8221;\u4fee\u6539&#8221;\u64cd\u4f5c\u90fd\u4f1a\u521b\u5efa\u65b0\u7684\u6570\u636e\u3002<\/li>\n\n\n\n<li><strong>\u4e3a\u4ec0\u4e48\u91cd\u8981<\/strong>\uff1a\u6d88\u9664\u7531\u5171\u4eab\u53ef\u53d8\u72b6\u6001\u5f15\u8d77\u7684Bug\uff0c\u7b80\u5316\u5e76\u53d1\u7f16\u7a0b\u3002<\/li>\n\n\n\n<li><strong>\u793a\u4f8b\u4e0e\u6ce8\u91ca<\/strong>\uff1a <code>\/\/ \u53ef\u53d8\u7684\u65b9\u5f0f\uff08\u547d\u4ee4\u5f0f\u601d\u7ef4\uff09 const mutableArray = [1, 2, 3]; mutableArray.push(4); \/\/ \u76f4\u63a5\u4fee\u6539\u539f\u6570\u7ec4 console.log(mutableArray); \/\/ [1, 2, 3, 4] \/\/ \u4e0d\u53ef\u53d8\u7684\u65b9\u5f0f\uff08\u51fd\u6570\u5f0f\u601d\u7ef4\uff09 const immutableArray = [1, 2, 3]; const newArray = [...immutableArray, 4]; \/\/ \u521b\u5efa\u65b0\u6570\u7ec4 console.log(immutableArray); \/\/ [1, 2, 3] - \u539f\u6570\u7ec4\u672a\u6539\u53d8 console.log(newArray); \/\/ [1, 2, 3, 4] - \u65b0\u6570\u7ec4 \/\/ \u5bf9\u8c61\u4e5f\u662f\u5982\u6b64 const person = { name: 'Alice', age: 30 }; const updatedPerson = { ...person, age: 31 }; \/\/ \u521b\u5efa\u65b0\u5bf9\u8c61<\/code> <strong>\u6ce8\u91ca<\/strong>\uff1a\u5728JavaScript\u4e2d\uff0c\u4e0d\u53ef\u53d8\u6027\u9700\u8981\u5f00\u53d1\u8005\u81ea\u89c9\u7ef4\u62a4\uff08\u4f7f\u7528\u5c55\u5f00\u8fd0\u7b97\u7b26<code>...<\/code>\u3001<code>Object.assign<\/code>\u3001\u6570\u7ec4\u7684<code>map\/filter<\/code>\u7b49\u65b9\u6cd5\uff09\u3002\u5728\u7eaf\u51fd\u6570\u5f0f\u8bed\u8a00\uff08\u5982Haskell\u3001Clojure\uff09\u4e2d\uff0c\u4e0d\u53ef\u53d8\u6027\u662f\u8bed\u8a00\u7ea7\u522b\u7684\u5f3a\u5236\u7ea6\u675f\u3002\u4e0d\u53ef\u53d8\u6570\u636e\u5929\u7136\u7ebf\u7a0b\u5b89\u5168\uff0c\u4e14\u6613\u4e8e\u5b9e\u73b0\u65f6\u95f4\u65c5\u884c\u8c03\u8bd5\u3002<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>c. \u9ad8\u9636\u51fd\u6570\u4e0e\u51fd\u6570\u7ec4\u5408<\/strong><\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u662f\u4ec0\u4e48<\/strong>\uff1a\u51fd\u6570\u53ef\u4ee5\u4f5c\u4e3a\u53c2\u6570\u4f20\u9012\u3001\u4f5c\u4e3a\u8fd4\u56de\u503c\u8fd4\u56de\uff0c\u5e76\u4e14\u53ef\u4ee5\u7ec4\u5408\u6210\u65b0\u51fd\u6570\u3002<\/li>\n\n\n\n<li><strong>\u4e3a\u4ec0\u4e48\u91cd\u8981<\/strong>\uff1a\u5b9e\u73b0\u62bd\u8c61\u548c\u4ee3\u7801\u590d\u7528\uff0c\u6784\u5efa\u590d\u6742\u884c\u4e3a\u3002<\/li>\n\n\n\n<li><strong>\u793a\u4f8b\u4e0e\u6ce8\u91ca<\/strong>\uff1a <code>\/\/ \u9ad8\u9636\u51fd\u6570\uff1a\u63a5\u53d7\u51fd\u6570\u4f5c\u4e3a\u53c2\u6570\u6216\u8fd4\u56de\u51fd\u6570 function multiplyBy(factor) { \/\/ \u8fd4\u56de\u4e00\u4e2a\u65b0\u51fd\u6570\uff08\u95ed\u5305\uff01\uff09 return function(number) { return number * factor; }; } const double = multiplyBy(2); const triple = multiplyBy(3); console.log(double(5)); \/\/ 10 console.log(triple(5)); \/\/ 15 \/\/ \u51fd\u6570\u7ec4\u5408\uff1a\u5c06\u591a\u4e2a\u51fd\u6570\u7ec4\u5408\u6210\u4e00\u4e2a\u65b0\u51fd\u6570 const add = (a, b) => a + b; const square = x => x * x; \/\/ \u624b\u52a8\u7ec4\u5408 const addThenSquare = (a, b) => square(add(a, b)); console.log(addThenSquare(2, 3)); \/\/ 25 \/\/ \u901a\u7528\u7ec4\u5408\u51fd\u6570 const compose = (f, g) => (x) => f(g(x)); const addThenSquareComposed = compose(square, add.bind(null, 2, 3)); console.log(addThenSquareComposed()); \/\/ 25<\/code> <strong>\u6ce8\u91ca<\/strong>\uff1a\u9ad8\u9636\u51fd\u6570\u548c\u51fd\u6570\u7ec4\u5408\u662f\u51fd\u6570\u5f0f\u7f16\u7a0b\u7684\u8868\u8fbe\u529b\u6e90\u6cc9\u3002\u5b83\u4eec\u5141\u8bb8\u6211\u4eec\u521b\u5efa\u62bd\u8c61\u5c42\uff0c\u5c06\u7b80\u5355\u51fd\u6570\u7ec4\u5408\u6210\u590d\u6742\u884c\u4e3a\u3002\u8fd9\u4e0e\u6570\u5b66\u4e2d\u7684\u51fd\u6570\u590d\u5408<code>f(g(x))<\/code>\u6982\u5ff5\u4e00\u81f4\u3002\u5728\u51fd\u6570\u5f0f\u8bed\u8a00\u4e2d\uff0c\u901a\u5e38\u6709\u66f4\u4f18\u96c5\u7684\u7ec4\u5408\u65b9\u5f0f\uff08\u5982Elixir\u7684\u7ba1\u9053\u64cd\u4f5c\u7b26<code>|><\/code>\uff09\u3002<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>d. \u58f0\u660e\u5f0f\u6570\u636e\u5904\u7406<\/strong><\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u662f\u4ec0\u4e48<\/strong>\uff1a\u4f7f\u7528<code>map<\/code>\u3001<code>filter<\/code>\u3001<code>reduce<\/code>\u7b49\u64cd\u4f5c\u63cf\u8ff0\u6570\u636e\u8f6c\u6362\uff0c\u800c\u975e\u663e\u5f0f\u5faa\u73af\u3002<\/li>\n\n\n\n<li><strong>\u4e3a\u4ec0\u4e48\u91cd\u8981<\/strong>\uff1a\u66f4\u7b80\u6d01\u3001\u66f4\u8868\u8fbe\u610f\u56fe\u3001\u66f4\u6613\u4e8e\u5e76\u884c\u5316\u3002<\/li>\n\n\n\n<li><strong>\u793a\u4f8b\u4e0e\u6ce8\u91ca<\/strong>\uff1a <code>\/\/ \u547d\u4ee4\u5f0f\u65b9\u5f0f\uff1a\u63cf\u8ff0\"\u5982\u4f55\u505a\" const numbers = [1, 2, 3, 4, 5]; let doubledEvens = []; for (let i = 0; i &lt; numbers.length; i++) { if (numbers[i] % 2 === 0) { doubledEvens.push(numbers[i] * 2); } } \/\/ \u51fd\u6570\u5f0f\u65b9\u5f0f\uff1a\u63cf\u8ff0\"\u505a\u4ec0\u4e48\" const doubledEvensFP = numbers .filter(n => n % 2 === 0) \/\/ \u8fc7\u6ee4\u5076\u6570 .map(n => n * 2); \/\/ \u6bcf\u4e2a\u4e58\u4ee52 console.log(doubledEvensFP); \/\/ [4, 8] \/\/ \u4f7f\u7528reduce\u8ba1\u7b97\u603b\u548c const sum = numbers.reduce((acc, curr) => acc + curr, 0); console.log(sum); \/\/ 15<\/code> <strong>\u6ce8\u91ca<\/strong>\uff1a<code>map\/filter\/reduce<\/code>\u662f\u51fd\u6570\u5f0f\u7f16\u7a0b\u7684\u4e09\u9a7e\u9a6c\u8f66\u3002\u5b83\u4eec\u5c06\u5faa\u73af\u62bd\u8c61\u4e3a\u9ad8\u9636\u64cd\u4f5c\uff0c\u8ba9\u5f00\u53d1\u8005\u4e13\u6ce8\u4e8e\u8f6c\u6362\u903b\u8f91\u800c\u975e\u8fed\u4ee3\u7ec6\u8282\u3002\u8fd9\u79cd\u98ce\u683c\u66f4\u63a5\u8fd1\u81ea\u7136\u8bed\u8a00\uff1a&#8221;\u8fc7\u6ee4\u51fa\u5076\u6570\uff0c\u7136\u540e\u5c06\u5b83\u4eec\u52a0\u500d&#8221;\u3002\u66f4\u91cd\u8981\u7684\u662f\uff0c\u8fd9\u4e9b\u64cd\u4f5c\u53ef\u4ee5\u8f7b\u677e\u5e76\u884c\u6267\u884c\uff08\u5982\u4f7f\u7528Web Workers\uff09\uff0c\u56e0\u4e3a\u5b83\u4eec\u4e0d\u5171\u4eab\u53ef\u53d8\u72b6\u6001\u3002<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>3. \u51fd\u6570\u5f0f\u7f16\u7a0b\u7684\u4f18\u52bf\u4e0e\u6311\u6218<\/strong><\/h3>\n\n\n\n<p><strong>\u4f18\u52bf<\/strong>\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u66f4\u53ef\u9884\u6d4b\u7684\u4ee3\u7801<\/strong>\uff1a\u7eaf\u51fd\u6570\u548c\u4e0d\u53ef\u53d8\u6027\u51cf\u5c11\u610f\u5916\u884c\u4e3a\u3002<\/li>\n\n\n\n<li><strong>\u66f4\u6613\u4e8e\u6d4b\u8bd5\u548c\u8c03\u8bd5<\/strong>\uff1a\u6ca1\u6709\u526f\u4f5c\u7528\uff0c\u5355\u5143\u6d4b\u8bd5\u66f4\u7b80\u5355\u3002<\/li>\n\n\n\n<li><strong>\u66f4\u597d\u7684\u5e76\u53d1\u652f\u6301<\/strong>\uff1a\u4e0d\u53ef\u53d8\u6570\u636e\u5929\u7136\u7ebf\u7a0b\u5b89\u5168\u3002<\/li>\n\n\n\n<li><strong>\u66f4\u5f3a\u7684\u8868\u8fbe\u80fd\u529b<\/strong>\uff1a\u9ad8\u9636\u51fd\u6570\u548c\u7ec4\u5408\u5141\u8bb8\u521b\u5efa\u5f3a\u5927\u7684\u62bd\u8c61\u3002<\/li>\n<\/ol>\n\n\n\n<p><strong>\u6311\u6218<\/strong>\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u5b66\u4e60\u66f2\u7ebf<\/strong>\uff1a\u9700\u8981\u601d\u7ef4\u65b9\u5f0f\u7684\u8f6c\u53d8\uff0c\u5c24\u5176\u662f\u5bf9\u4e60\u60ef\u4e86\u547d\u4ee4\u5f0f\u7f16\u7a0b\u7684\u5f00\u53d1\u8005\u3002<\/li>\n\n\n\n<li><strong>\u6027\u80fd\u8003\u91cf<\/strong>\uff1a\u4e0d\u53ef\u53d8\u6027\u53ef\u80fd\u5e26\u6765\u5185\u5b58\u5f00\u9500\uff08\u9700\u8981\u901a\u8fc7\u7ed3\u6784\u5171\u4eab\u7b49\u6280\u672f\u4f18\u5316\uff09\u3002<\/li>\n\n\n\n<li><strong>\u4e0e\u73b0\u5b9e\u4e16\u754c\u7684\u4ea4\u4e92<\/strong>\uff1aI\/O\u3001DOM\u64cd\u4f5c\u672c\u8d28\u4e0a\u6709\u526f\u4f5c\u7528\uff0c\u9700\u8981\u7279\u6b8a\u5904\u7406\uff08\u5982Monad\uff09\u3002<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u56db\u3001\u54cd\u5e94\u5f0f\u7f16\u7a0b\uff08Reactive Programming\uff0cRP\uff09<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>1. \u6838\u5fc3\u601d\u60f3\uff1a\u6570\u636e\u6d41\u548c\u53d8\u5316\u4f20\u64ad<\/strong><\/h3>\n\n\n\n<p>\u54cd\u5e94\u5f0f\u7f16\u7a0b\u662f<strong>\u5173\u4e8e\u6570\u636e\u6d41\u548c\u53d8\u5316\u4f20\u64ad\u7684\u7f16\u7a0b\u8303\u5f0f<\/strong>\u3002\u5b83\u5173\u6ce8\u968f\u7740\u65f6\u95f4\u53d8\u5316\u7684\u6570\u636e\u5e8f\u5217\uff08\u6d41\uff09\uff0c\u4ee5\u53ca\u8fd9\u4e9b\u6570\u636e\u6d41\u4e4b\u95f4\u7684\u4f9d\u8d56\u5173\u7cfb\u3002<\/p>\n\n\n\n<p><strong>\u5173\u952e\u6d1e\u5bdf<\/strong>\uff1a\u54cd\u5e94\u5f0f\u7f16\u7a0b\u5c06<strong>\u4e00\u5207\u90fd\u89c6\u4e3a\u6d41<\/strong>\uff1a\u7528\u6237\u8f93\u5165\u3001\u7f51\u7edc\u54cd\u5e94\u3001\u5b9a\u65f6\u4e8b\u4ef6\u3001\u53d8\u91cf\u503c\u7684\u53d8\u5316\u7b49\u3002\u901a\u8fc7\u58f0\u660e\u5f0f\u5730\u7ec4\u5408\u548c\u8f6c\u6362\u8fd9\u4e9b\u6d41\uff0c\u6784\u5efa\u54cd\u5e94\u5f0f\u7cfb\u7edf\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>2. \u54cd\u5e94\u5f0f\u7f16\u7a0b\u7684\u6838\u5fc3\u6982\u5ff5<\/strong><\/h3>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>a. \u89c2\u5bdf\u8005\u6a21\u5f0f\u4e0e\u6570\u636e\u6d41<\/strong><\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u662f\u4ec0\u4e48<\/strong>\uff1a\u54cd\u5e94\u5f0f\u7f16\u7a0b\u5efa\u7acb\u5728\u89c2\u5bdf\u8005\u6a21\u5f0f\u4e4b\u4e0a\uff0c\u4f46\u5c06\u5176\u63a8\u5e7f\u5230\u8fde\u7eed\u7684\u6570\u636e\u6d41\u3002<\/li>\n\n\n\n<li><strong>\u4e0e\u51fd\u6570\u5f0f\u7f16\u7a0b\u7684\u5173\u7cfb<\/strong>\uff1a\u54cd\u5e94\u5f0f\u7f16\u7a0b\u5e38\u4e0e\u51fd\u6570\u5f0f\u7f16\u7a0b\u7ed3\u5408\uff08\u79f0\u4e3a\u51fd\u6570\u54cd\u5e94\u5f0f\u7f16\u7a0b\uff0cFRP\uff09\uff0c\u4f7f\u7528\u7eaf\u51fd\u6570\u8f6c\u6362\u6570\u636e\u6d41\u3002<\/li>\n\n\n\n<li><strong>\u793a\u4f8b\u4e0e\u6ce8\u91ca<\/strong>\uff1a <code>\/\/ \u4f20\u7edf\u89c2\u5bdf\u8005\u6a21\u5f0f\uff08\u79bb\u6563\u4e8b\u4ef6\uff09 class Observable { constructor() { this.subscribers = []; } subscribe(fn) { this.subscribers.push(fn); } next(value) { this.subscribers.forEach(fn => fn(value)); } } const clicks = new Observable(); clicks.subscribe(x => console.log(`\u70b9\u51fb\u4e86: ${x}`)); \/\/ \u6a21\u62df\u70b9\u51fb\u4e8b\u4ef6 clicks.next('\u6309\u94aeA'); clicks.next('\u6309\u94aeB'); \/\/ \u54cd\u5e94\u5f0f\u601d\u7ef4\uff1a\u5c06\u4e8b\u4ef6\u89c6\u4e3a\u6d41 \/\/ \u5047\u8bbe\u6211\u4eec\u6709\u9f20\u6807\u79fb\u52a8\u4e8b\u4ef6\u6d41 \/\/ mouseMoveStream: ---(x1,y1)---(x2,y2)---(x3,y3)---> \/\/ \u6211\u4eec\u53ef\u4ee5\u8f6c\u6362\u8fd9\u4e2a\u6d41 \/\/ distancesStream: ---d1---d2---d3---><\/code> <strong>\u6ce8\u91ca<\/strong>\uff1a\u54cd\u5e94\u5f0f\u7f16\u7a0b\u6269\u5c55\u4e86\u89c2\u5bdf\u8005\u6a21\u5f0f\uff0c\u4e0d\u4ec5\u5904\u7406\u79bb\u6563\u4e8b\u4ef6\uff0c\u8fd8\u5904\u7406\u8fde\u7eed\u7684\u6570\u636e\u5e8f\u5217\uff08\u6d41\uff09\u3002\u6d41\u53ef\u4ee5\u8868\u793a\u4efb\u4f55\u968f\u65f6\u95f4\u53d8\u5316\u7684\u503c\uff1a\u9f20\u6807\u4f4d\u7f6e\u3001\u80a1\u7968\u4ef7\u683c\u3001\u804a\u5929\u6d88\u606f\u7b49\u3002\u8fd9\u79cd\u7edf\u4e00\u7684\u62bd\u8c61\u975e\u5e38\u5f3a\u5927\u3002<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>b. \u54cd\u5e94\u5f0f\u6269\u5c55\uff08RxJS\uff09\u793a\u4f8b<\/strong><\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u662f\u4ec0\u4e48<\/strong>\uff1aRxJS\u662fJavaScript\u7684\u54cd\u5e94\u5f0f\u7f16\u7a0b\u5e93\uff0c\u63d0\u4f9b\u4e86\u4e30\u5bcc\u7684\u64cd\u4f5c\u7b26\u6765\u5904\u7406\u5f02\u6b65\u6570\u636e\u6d41\u3002<\/li>\n\n\n\n<li><strong>\u4e3a\u4ec0\u4e48\u91cd\u8981<\/strong>\uff1a\u7edf\u4e00\u4e86\u5404\u79cd\u5f02\u6b65\u7f16\u7a0b\u6a21\u5f0f\uff08\u56de\u8c03\u3001Promise\u3001\u4e8b\u4ef6\uff09\uff0c\u63d0\u4f9b\u58f0\u660e\u5f0f\u7684\u6d41\u64cd\u4f5c\u3002<\/li>\n\n\n\n<li><strong>\u793a\u4f8b\u4e0e\u6ce8\u91ca<\/strong>\uff1a <code>\/\/ \u4f7f\u7528RxJS\uff08\u9700\u8981\u5148\u5b89\u88c5rxjs\u5e93\uff09 import { fromEvent, interval, combineLatest } from 'rxjs'; import { map, filter, throttleTime, take } from 'rxjs\/operators'; \/\/ \u521b\u5efaDOM\u4e8b\u4ef6\u6d41 const button = document.getElementById('myButton'); const clickStream = fromEvent(button, 'click'); \/\/ \u8f6c\u6362\u6d41\uff1a\u8282\u6d41\u3001\u8ba1\u6570\u3001\u8fc7\u6ee4 const processedStream = clickStream.pipe( throttleTime(1000), \/\/ 1\u79d2\u5185\u53ea\u5141\u8bb8\u4e00\u6b21\u70b9\u51fb map((event, index) => `\u70b9\u51fb\u6b21\u6570: ${index + 1}`), \/\/ \u8f6c\u6362\u4e3a\u6d88\u606f filter((message, index) => index &lt; 5) \/\/ \u53ea\u53d6\u524d5\u6b21 ); \/\/ \u8ba2\u9605\u6d41 processedStream.subscribe({ next: message => console.log(message), complete: () => console.log('\u5df2\u5b8c\u62105\u6b21\u70b9\u51fb') }); \/\/ \u7ec4\u5408\u591a\u4e2a\u6d41 const timer1 = interval(1000).pipe(take(5)); \/\/ \u6bcf\u79d2\u89e6\u53d1\uff0c\u51715\u6b21 const timer2 = interval(2000).pipe(take(3)); \/\/ \u6bcf2\u79d2\u89e6\u53d1\uff0c\u51713\u6b21 const combined = combineLatest([timer1, timer2]).pipe( map(([val1, val2]) => `\u5b9a\u65f6\u56681: ${val1}, \u5b9a\u65f6\u56682: ${val2}`) ); combined.subscribe(console.log); \/\/ \u8f93\u51fa\u793a\u4f8b\uff1a \/\/ \"\u5b9a\u65f6\u56681: 0, \u5b9a\u65f6\u56682: 0\" (2\u79d2\u540e) \/\/ \"\u5b9a\u65f6\u56681: 2, \u5b9a\u65f6\u56682: 0\" (\u7b2c3\u79d2) \/\/ \"\u5b9a\u65f6\u56681: 2, \u5b9a\u65f6\u56682: 1\" (\u7b2c4\u79d2) \/\/ ...<\/code> <strong>\u6ce8\u91ca<\/strong>\uff1aRxJS\u7684\u64cd\u4f5c\u7b26\uff08\u5982<code>map<\/code>\u3001<code>filter<\/code>\u3001<code>throttleTime<\/code>\uff09\u7c7b\u4f3c\u4e8e\u6570\u7ec4\u65b9\u6cd5\uff0c\u4f46\u5b83\u4eec\u5904\u7406\u7684\u662f\u968f\u65f6\u95f4\u63a8\u79fb\u5230\u8fbe\u7684\u503c\u6d41\u3002\u8fd9\u4f7f\u5f97\u5904\u7406\u590d\u6742\u7684\u5f02\u6b65\u4ea4\u4e92\u53d8\u5f97\u58f0\u660e\u5f0f\u548c\u53ef\u7ec4\u5408\u3002\u6bcf\u4e2a\u64cd\u4f5c\u7b26\u8fd4\u56de\u4e00\u4e2a\u65b0\u7684\u53ef\u89c2\u5bdf\u5bf9\u8c61\uff08\u6d41\uff09\uff0c\u7b26\u5408\u4e0d\u53ef\u53d8\u539f\u5219\u3002<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>c. \u54cd\u5e94\u5f0fUI\u4e0e\u72b6\u6001\u7ba1\u7406<\/strong><\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u662f\u4ec0\u4e48<\/strong>\uff1aUI\u4f5c\u4e3a\u6570\u636e\u6d41\u7684\u51fd\u6570\uff0c\u72b6\u6001\u53d8\u5316\u81ea\u52a8\u89e6\u53d1UI\u66f4\u65b0\u3002<\/li>\n\n\n\n<li><strong>\u4e3a\u4ec0\u4e48\u91cd\u8981<\/strong>\uff1a\u7b80\u5316UI\u7f16\u7a0b\uff0c\u81ea\u52a8\u4fdd\u6301UI\u4e0e\u72b6\u6001\u540c\u6b65\u3002<\/li>\n\n\n\n<li><strong>\u793a\u4f8b\u4e0e\u6ce8\u91ca<\/strong>\uff1a <code>\/\/ \u7b80\u5316\u7684\u54cd\u5e94\u5f0f\u72b6\u6001\u7ba1\u7406\u793a\u4f8b class ReactiveState { constructor(initialState) { this.state = initialState; this.subscribers = []; }\/\/ \u66f4\u65b0\u72b6\u6001\uff08\u4e0d\u53ef\u53d8\u65b9\u5f0f\uff09 setState(updater) { const prevState = this.state; this.state = updater(prevState); \/\/ \u901a\u77e5\u6240\u6709\u8ba2\u9605\u8005 this.subscribers.forEach(sub =&amp;gt; sub(this.state, prevState)); } \/\/ \u8ba2\u9605\u72b6\u6001\u53d8\u5316 subscribe(callback) { this.subscribers.push(callback); return () =&amp;gt; { this.subscribers = this.subscribers.filter(sub =&amp;gt; sub !== callback); }; }} \/\/ \u521b\u5efa\u54cd\u5e94\u5f0f\u72b6\u6001 const appState = new ReactiveState({ count: 0, user: null }); \/\/ UI\u7ec4\u4ef6\u8ba2\u9605\u72b6\u6001 const unsubscribe = appState.subscribe((newState, oldState) => { console.log('\u72b6\u6001\u53d8\u5316:', oldState, '->', newState); \/\/ \u8fd9\u91cc\u53ef\u4ee5\u89e6\u53d1UI\u66f4\u65b0 document.getElementById('counter').textContent = newState.count; }); \/\/ \u66f4\u65b0\u72b6\u6001\uff0cUI\u81ea\u52a8\u54cd\u5e94 appState.setState(state => ({ ...state, count: state.count + 1 })); appState.setState(state => ({ ...state, user: { name: 'Alice' } })); \/\/ \u73b0\u4ee3\u524d\u7aef\u6846\u67b6\uff08\u5982React\u3001Vue\u3001Svelte\uff09\u90fd\u5185\u7f6e\u4e86\u54cd\u5e94\u5f0f\u72b6\u6001\u7ba1\u7406<\/code> <strong>\u6ce8\u91ca<\/strong>\uff1a\u73b0\u4ee3\u524d\u7aef\u6846\u67b6\u7684\u6838\u5fc3\u5c31\u662f\u54cd\u5e94\u5f0fUI\u3002Vue 3\u7684Composition API\u3001React\u7684Hooks + Context\u3001Svelte\u7684\u54cd\u5e94\u5f0f\u58f0\u660e\uff0c\u90fd\u662f\u54cd\u5e94\u5f0f\u7f16\u7a0b\u601d\u60f3\u7684\u5177\u4f53\u5b9e\u73b0\u3002\u5b83\u4eec\u8ba9UI\u6210\u4e3a\u72b6\u6001\u7684\u58f0\u660e\u5f0f\u6620\u5c04\uff0c\u5f53\u72b6\u6001\u53d8\u5316\u65f6\uff0cUI\u81ea\u52a8\u66f4\u65b0\u3002<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>3. \u54cd\u5e94\u5f0f\u7f16\u7a0b\u7684\u4f18\u52bf\u4e0e\u6311\u6218<\/strong><\/h3>\n\n\n\n<p><strong>\u4f18\u52bf<\/strong>\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u7edf\u4e00\u7684\u5f02\u6b65\u5904\u7406<\/strong>\uff1a\u7528\u4e00\u81f4\u7684\u6a21\u578b\u5904\u7406\u4e8b\u4ef6\u3001AJAX\u3001\u5b9a\u65f6\u5668\u7b49\u3002<\/li>\n\n\n\n<li><strong>\u58f0\u660e\u5f0f\u6570\u636e\u6d41\u7ec4\u5408<\/strong>\uff1a\u590d\u6742\u5f02\u6b65\u903b\u8f91\u53d8\u5f97\u53ef\u8bfb\u548c\u53ef\u7ef4\u62a4\u3002<\/li>\n\n\n\n<li><strong>\u81ea\u52a8\u4f9d\u8d56\u7ba1\u7406<\/strong>\uff1a\u6570\u636e\u6d41\u4e4b\u95f4\u7684\u4f9d\u8d56\u5173\u7cfb\u81ea\u52a8\u7ef4\u62a4\u3002<\/li>\n\n\n\n<li><strong>\u66f4\u597d\u7684\u9519\u8bef\u5904\u7406<\/strong>\uff1a\u6d41\u64cd\u4f5c\u7b26\u63d0\u4f9b\u4e86\u7edf\u4e00\u7684\u9519\u8bef\u5904\u7406\u673a\u5236\u3002<\/li>\n<\/ol>\n\n\n\n<p><strong>\u6311\u6218<\/strong>\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u5b66\u4e60\u66f2\u7ebf<\/strong>\uff1a\u54cd\u5e94\u5f0f\u601d\u7ef4\u548c\u64cd\u4f5c\u7b26\u9700\u8981\u65f6\u95f4\u638c\u63e1\u3002<\/li>\n\n\n\n<li><strong>\u8c03\u8bd5\u96be\u5ea6<\/strong>\uff1a\u5f02\u6b65\u6570\u636e\u6d41\u53ef\u80fd\u96be\u4ee5\u8ddf\u8e2a\u548c\u8c03\u8bd5\u3002<\/li>\n\n\n\n<li><strong>\u5185\u5b58\u6cc4\u6f0f\u98ce\u9669<\/strong>\uff1a\u9700\u8981\u6b63\u786e\u7ba1\u7406\u8ba2\u9605\uff0c\u907f\u514d\u672a\u53d6\u6d88\u8ba2\u9605\u5bfc\u81f4\u7684\u5185\u5b58\u6cc4\u6f0f\u3002<\/li>\n\n\n\n<li><strong>\u6982\u5ff5\u62bd\u8c61<\/strong>\uff1a\u7406\u89e3&#8221;\u70ed\u6d41&#8221;\u3001&#8221;\u51b7\u6d41&#8221;\u3001&#8221;\u80cc\u538b&#8221;\u7b49\u9ad8\u7ea7\u6982\u5ff5\u9700\u8981\u5b9e\u8df5\u3002<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u4e94\u3001\u8303\u5f0f\u878d\u5408\u4e0e\u73b0\u4ee3\u5316\u5e94\u7528<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>1. \u591a\u8303\u5f0f\u8bed\u8a00\u4e0e\u6df7\u5408\u7f16\u7a0b<\/strong><\/h3>\n\n\n\n<p>\u73b0\u4ee3\u7f16\u7a0b\u8bed\u8a00\u5927\u591a\u652f\u6301\u591a\u8303\u5f0f\uff0c\u5141\u8bb8\u5f00\u53d1\u8005\u6839\u636e\u95ee\u9898\u9009\u62e9\u6700\u5408\u9002\u7684\u601d\u7ef4\u65b9\u5f0f\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ JavaScript\u4e2d\u7684\u591a\u8303\u5f0f\u793a\u4f8b\n\/\/ 1. \u547d\u4ee4\u5f0f\/\u8fc7\u7a0b\u5f0f\nfor (let i = 0; i &lt; 10; i++) { console.log(i); }\n\n\/\/ 2. \u9762\u5411\u5bf9\u8c61\nclass User {\n    constructor(name) { this.name = name; }\n    greet() { return `Hello, ${this.name}`; }\n}\n\n\/\/ 3. \u51fd\u6570\u5f0f\nconst users = &#91;'Alice', 'Bob', 'Charlie'];\nconst greetings = users.map(name =&gt; `Hello, ${name}`);\n\n\/\/ 4. \u54cd\u5e94\u5f0f\uff08\u4f7f\u7528RxJS\uff09\nimport { from } from 'rxjs';\nconst userStream = from(users);\nuserStream.subscribe(console.log);<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>2. \u73b0\u4ee3\u6846\u67b6\u4e2d\u7684\u8303\u5f0f\u878d\u5408<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>React + Redux<\/strong>\uff1a\u51fd\u6570\u5f0f\uff08\u7eaf\u7ec4\u4ef6\u3001\u4e0d\u53ef\u53d8\u72b6\u6001\uff09 + \u54cd\u5e94\u5f0f\uff08\u72b6\u6001\u53d8\u5316\u89e6\u53d1UI\u66f4\u65b0\uff09\u3002<\/li>\n\n\n\n<li><strong>Vue 3<\/strong>\uff1a\u54cd\u5e94\u5f0f\uff08Composition API\uff09 + \u51fd\u6570\u5f0f\uff08\u8ba1\u7b97\u5c5e\u6027\u3001watchEffect\uff09\u3002<\/li>\n\n\n\n<li><strong>Angular<\/strong>\uff1a\u9762\u5411\u5bf9\u8c61\uff08\u7c7b\u3001\u88c5\u9970\u5668\uff09 + \u54cd\u5e94\u5f0f\uff08RxJS\u96c6\u6210\uff09\u3002<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>3. \u5982\u4f55\u9009\u62e9\u7f16\u7a0b\u8303\u5f0f\uff1f<\/strong><\/h3>\n\n\n\n<p>\u8003\u8651\u4ee5\u4e0b\u56e0\u7d20\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u95ee\u9898\u9886\u57df<\/strong>\uff1a\u6570\u636e\u8f6c\u6362\u5bc6\u96c6\u578b\u9002\u5408\u51fd\u6570\u5f0f\uff0c\u4e8b\u4ef6\u9a71\u52a8\u7cfb\u7edf\u9002\u5408\u54cd\u5e94\u5f0f\u3002<\/li>\n\n\n\n<li><strong>\u56e2\u961f\u7ecf\u9a8c<\/strong>\uff1a\u9009\u62e9\u56e2\u961f\u719f\u6089\u548c\u80fd\u591f\u7ef4\u62a4\u7684\u8303\u5f0f\u3002<\/li>\n\n\n\n<li><strong>\u6027\u80fd\u8981\u6c42<\/strong>\uff1a\u5b9e\u65f6\u7cfb\u7edf\u53ef\u80fd\u66f4\u9002\u5408\u547d\u4ee4\u5f0f\u4f18\u5316\u3002<\/li>\n\n\n\n<li><strong>\u53ef\u7ef4\u62a4\u6027<\/strong>\uff1a\u957f\u671f\u9879\u76ee\u53ef\u80fd\u53d7\u76ca\u4e8e\u51fd\u6570\u5f0f\u7684\u53ef\u9884\u6d4b\u6027\u3002<\/li>\n<\/ol>\n\n\n\n<p><strong>\u5b9e\u7528\u5efa\u8bae<\/strong>\uff1a\u4ece\u5355\u4e00\u8303\u5f0f\u5f00\u59cb\u6df1\u5165\u5b66\u4e60\uff0c\u7136\u540e\u9010\u6e10\u878d\u5408\u3002\u8bb8\u591a\u5b9e\u9645\u9879\u76ee\u4f1a\u6df7\u5408\u4f7f\u7528\u591a\u79cd\u8303\u5f0f\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4f7f\u7528\u51fd\u6570\u5f0f\u5904\u7406\u6570\u636e\u8f6c\u6362<\/li>\n\n\n\n<li>\u4f7f\u7528\u9762\u5411\u5bf9\u8c61\u7ec4\u7ec7\u4e1a\u52a1\u903b\u8f91<\/li>\n\n\n\n<li>\u4f7f\u7528\u54cd\u5e94\u5f0f\u5904\u7406\u5f02\u6b65\u548c\u4e8b\u4ef6<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u516d\u3001\u603b\u7ed3\u4e0e\u601d\u8003<\/strong><\/h2>\n\n\n\n<p>\u4ece\u8bbe\u8ba1\u6a21\u5f0f\u5230\u7f16\u7a0b\u8303\u5f0f\uff0c\u4f60\u7684\u8f6f\u4ef6\u5f00\u53d1\u89c6\u89d2\u6b63\u5728\u4ece<strong>\u5fae\u89c2\u6218\u672f<\/strong>\u63d0\u5347\u5230<strong>\u5b8f\u89c2\u6218\u7565<\/strong>\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u8bbe\u8ba1\u6a21\u5f0f<\/strong>\uff08\u7b2c62\u8bfe\uff09\uff1a\u89e3\u51b3\u7279\u5b9a\u95ee\u9898\u7684<strong>\u5177\u4f53\u65b9\u6848\u6a21\u677f<\/strong>\u3002<\/li>\n\n\n\n<li><strong>\u7f16\u7a0b\u8303\u5f0f<\/strong>\uff08\u672c\u8bfe\uff09\uff1a\u6307\u5bfc\u8f6f\u4ef6\u8bbe\u8ba1\u7684<strong>\u6574\u4f53\u601d\u7ef4\u6846\u67b6<\/strong>\u3002<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\u8303\u5f0f\u601d\u7ef4\u7684\u5173\u952e\u6536\u83b7<\/strong><\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u51fd\u6570\u5f0f\u7f16\u7a0b<\/strong>\u6559\u5bfc\u6211\u4eec\uff1a<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u901a\u8fc7\u7eaf\u51fd\u6570\u548c\u4e0d\u53ef\u53d8\u6027\u6784\u5efa\u53ef\u9884\u6d4b\u7684\u7cfb\u7edf<\/li>\n\n\n\n<li>\u901a\u8fc7\u9ad8\u9636\u51fd\u6570\u548c\u7ec4\u5408\u6784\u5efa\u62bd\u8c61<\/li>\n\n\n\n<li>\u901a\u8fc7\u58f0\u660e\u5f0f\u64cd\u4f5c\u805a\u7126\u4e8e&#8221;\u505a\u4ec0\u4e48&#8221;\u800c\u975e&#8221;\u5982\u4f55\u505a&#8221;<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u54cd\u5e94\u5f0f\u7f16\u7a0b<\/strong>\u6559\u5bfc\u6211\u4eec\uff1a<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5c06\u4e00\u5207\u89c6\u4e3a\u968f\u65f6\u95f4\u53d8\u5316\u7684\u6570\u636e\u6d41<\/li>\n\n\n\n<li>\u901a\u8fc7\u58f0\u660e\u5f0f\u7ec4\u5408\u5904\u7406\u590d\u6742\u7684\u5f02\u6b65\u4ea4\u4e92<\/li>\n\n\n\n<li>\u6784\u5efa\u81ea\u52a8\u54cd\u5e94\u53d8\u5316\u7684\u7cfb\u7edf<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\u672a\u6765\u7684\u5b66\u4e60\u65b9\u5411<\/strong><\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u6df1\u5165\u5b66\u4e60\u7279\u5b9a\u8303\u5f0f<\/strong>\uff1a<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u51fd\u6570\u5f0f\uff1a\u5b66\u4e60Haskell\u3001Clojure\u6216Elixir\u4ee5\u83b7\u5f97\u7eaf\u51fd\u6570\u5f0f\u4f53\u9a8c<\/li>\n\n\n\n<li>\u54cd\u5e94\u5f0f\uff1a\u6df1\u5165\u638c\u63e1RxJS\u6216\u5b66\u4e60ReactiveX\u5176\u4ed6\u8bed\u8a00\u5b9e\u73b0<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u63a2\u7d22\u67b6\u6784\u8303\u5f0f<\/strong>\uff1a<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u9886\u57df\u9a71\u52a8\u8bbe\u8ba1\uff08DDD\uff09<\/li>\n\n\n\n<li>\u4e8b\u4ef6\u6eaf\u6e90\uff08Event Sourcing\uff09<\/li>\n\n\n\n<li>CQRS\uff08\u547d\u4ee4\u67e5\u8be2\u804c\u8d23\u5206\u79bb\uff09<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u5b9e\u8df5\u6df7\u5408\u8303\u5f0f\u5f00\u53d1<\/strong>\uff1a<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5728\u73b0\u4ee3\u6846\u67b6\u4e2d\u5e94\u7528\u51fd\u6570\u54cd\u5e94\u5f0f\u7f16\u7a0b<\/li>\n\n\n\n<li>\u6784\u5efa\u57fa\u4e8e\u6d41\u7684\u5fae\u670d\u52a1\u67b6\u6784<\/li>\n<\/ul>\n\n\n\n<p><strong>\u6700\u7ec8\u601d\u8003<\/strong>\uff1a\u7f16\u7a0b\u8303\u5f0f\u4e0d\u662f\u975e\u6b64\u5373\u5f7c\u7684\u9009\u62e9\uff0c\u800c\u662f\u89e3\u51b3\u95ee\u9898\u7684\u4e0d\u540c\u89c6\u89d2\u3002\u771f\u6b63\u4f18\u79c0\u7684\u5f00\u53d1\u8005\u4e0d\u662f&#8221;\u9762\u5411\u5bf9\u8c61\u7a0b\u5e8f\u5458&#8221;\u6216&#8221;\u51fd\u6570\u5f0f\u7a0b\u5e8f\u5458&#8221;\uff0c\u800c\u662f\u80fd\u591f<strong>\u6839\u636e\u95ee\u9898\u9009\u62e9\u5408\u9002\u7684\u5de5\u5177\uff0c\u878d\u5408\u591a\u79cd\u8303\u5f0f\u4f18\u70b9\u7684\u5de5\u7a0b\u5e08<\/strong>\u3002<\/p>\n\n\n\n<p>\u5f53\u4f60\u5728\u8bbe\u8ba1\u4e0b\u4e00\u4e2a\u7cfb\u7edf\u65f6\uff0c\u95ee\u81ea\u5df1\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u54ea\u4e9b\u90e8\u5206\u53ef\u4ee5\u4ece\u4e0d\u53ef\u53d8\u6570\u636e\u548c\u7eaf\u51fd\u6570\u4e2d\u53d7\u76ca\uff1f<\/li>\n\n\n\n<li>\u54ea\u4e9b\u5f02\u6b65\u4ea4\u4e92\u53ef\u4ee5\u7528\u6570\u636e\u6d41\u6765\u4f18\u96c5\u8868\u8fbe\uff1f<\/li>\n\n\n\n<li>\u5982\u4f55\u7ec4\u5408\u8fd9\u4e9b\u8303\u5f0f\u6765\u6784\u5efa\u66f4\u5065\u58ee\u3001\u66f4\u6613\u7ef4\u62a4\u7684\u7cfb\u7edf\uff1f<\/li>\n<\/ul>\n\n\n\n<p>\u638c\u63e1\u591a\u79cd\u7f16\u7a0b\u8303\u5f0f\uff0c\u5c31\u50cf\u638c\u63e1\u4e86\u591a\u79cd\u8bed\u8a00\uff1a\u6bcf\u79cd\u8bed\u8a00\u90fd\u80fd\u8868\u8fbe\u67d0\u4e9b\u601d\u60f3\u66f4\u4f18\u96c5\u3001\u66f4\u7cbe\u786e\u3002\u8fd9\u79cd\u591a\u8303\u5f0f\u601d\u7ef4\u80fd\u529b\uff0c\u5c06\u4f7f\u4f60\u6210\u4e3a\u66f4\u5168\u9762\u3001\u66f4\u6709\u521b\u9020\u529b\u7684\u8f6f\u4ef6\u5de5\u7a0b\u5e08\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u7b2c\u4e94\u5341\u4e5d\u8bfe\uff1a\u7ed3\u6784\u4f53\u4e0e\u7ec4\u5408\u6570\u636e &#8211; \u6570\u636e\u5efa\u6a21\u7684\u827a\u672f \u524d\u8a00\uff1a\u4ece\u79bb\u6563\u6570\u636e\u5230\u7ed3\u6784\u5316\u601d\u7ef4 \u5728\u8f6f\u4ef6\u5f00\u53d1\u4e2d\uff0c\u6570\u636e [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[30],"tags":[],"class_list":["post-1448","post","type-post","status-publish","format-standard","hentry","category-technology-horizon"],"_links":{"self":[{"href":"http:\/\/www.preluna.xyz\/index.php\/wp-json\/wp\/v2\/posts\/1448","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.preluna.xyz\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.preluna.xyz\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.preluna.xyz\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.preluna.xyz\/index.php\/wp-json\/wp\/v2\/comments?post=1448"}],"version-history":[{"count":3,"href":"http:\/\/www.preluna.xyz\/index.php\/wp-json\/wp\/v2\/posts\/1448\/revisions"}],"predecessor-version":[{"id":1460,"href":"http:\/\/www.preluna.xyz\/index.php\/wp-json\/wp\/v2\/posts\/1448\/revisions\/1460"}],"wp:attachment":[{"href":"http:\/\/www.preluna.xyz\/index.php\/wp-json\/wp\/v2\/media?parent=1448"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.preluna.xyz\/index.php\/wp-json\/wp\/v2\/categories?post=1448"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.preluna.xyz\/index.php\/wp-json\/wp\/v2\/tags?post=1448"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}