Web技术中心代码规范

本文档详细介绍了Web技术中心的代码规范,包括JS和CSS的命名规则、接口风格、注释规范等内容,旨在提高代码质量和可读性。
 [b][size=x-large][color=red] Web技术中心代码规范[/color][/size][/b]


前言
  软件的长期价值直接源于其编码质量。在它的整个生命周期里,一个程序可能会被许多人阅读或修改。如果一个程序可以清晰的展现出它的结构和特征,那就能减少在以后对其进行修改时出错的可能性,编程规范可以帮助程序员们增加程序的健壮性。基本所有的前端代码都是暴露给公众的,所以我们更应该保证其质量。
规范理念
Any violation to this guide is allowed if it enhances readability.
所有的代码都要变成可供他人容易阅读的。
--引用自Dojo Javascript 语法规范
规范详解
JS命名规范
必须使用 Tab 键进行代码缩进,以节约代码大小,建议设置编辑器的tab为4个空格的宽度(而不是4个空格)
接口风格
结构 规则 例如
类 驼峰式 ModuleClass()
公有方法 混合式 getPosition()
公有变量 混合式 frameStyle
常量 大写式 DEFAULT_FRAME_LAYOUT
其他建议风格,非必要
结构 规则
公有方法和属性 混合,例子:mixedCase
私有方法和属性 混合,例子:_mixedCase
方法(method)参数 混合,例子:mixedCase
本地(local)变量 混合,例子:mixedCase
所有语句结束后,必须使用 ; 号结束
所有变量必须是有意义的英文,严厉禁止拼音
变量允许使用公认英文缩写
类命名必须是驼峰式
常量必须所有单词大写,并且每个单词间加下划线
枚举类型时,枚举的命名必须有意义,枚举与枚举成员必须以驼峰式
常量和枚举必须在最前端定义,merge 时注意,必须把常量与枚举定义的文件放在文件列表的第一位
变量内的简写单词如果在开头则全小写:xmlDocument,如果不在开头则全大写:loadXML!!!
"on"只能用作事件的命名
函数开头必须是有意义的动词或动词短语
私有类的变量属性成员 建议 使用混合式命名,并前面下下划线
临时的全局变量放到一个全局的哈希表里,方便变量回收
所有全局变量必须初始化,尽量少用全局变量
大括号前面不能有换行符
保留字以及特有的dom属性不能作为变量名
特殊命名约定
前面加 “is” 的变量名应该为布尔值,亦可使用 “can” “has” “should”
前面加 ”str” 的变量名应该为字符串
前面加 “arr” 的变量名应该为数组
前面加 “num” 或 “count” 的变量名应该为数字
“o” 作为局部变量或参数,表示为Object
“e” 作为局部变量或参数,表示为Element
“evt” 作为局部变量或参数,表示为event
“err” 作为局部变量或参数,表示为error
重复变量建议使用 "i", "j", "k" (依次类推)等名称的变量(全世界公认)
能缩写的单词尽量缩写
避免产生令人误解的布尔值 isNotNumber isNan
处理错误的变量,必须在后面跟着 “Error”
初始化用的函数 必须使用 “init” 开头,如果一个页面只有初始化可以单独使用 init()
尽量做有意义的代码折行,不要让一行代码过长。(HTML 字符串除外)
操作符 建议 使用空格隔开
函数调用和方法 避免 使用空白
逗号(,) 建议 使用空白隔开。
不允许频繁使用 previousSibling 和 nextSibling
词法结构
普通代码段应该看起来如下:
while(!isDone){ doSomething(); isDone = moreToDo();}
变量定义方法如下:
var a = null, b = 1, c = 0;
函数定义方法如下:
var funcA = function(){ var a = 0; ...}
if 语句应该看起来像这样:
if(someCondition){ statements;}else if(someOtherCondition){ statements;}else{ statements;}
for 语句应该看起来像这样:
for(initialization; condition; update){ statements;}
while 语句应该看起来像这样:
while(!isDone){ doSomething(); isDone = moreToDo();}
do ... while 语句应该看起来像这样:
do{ statements;}while(condition);
switch 语句应该看起来像这样:
switch(condition){ case "A": statements; //注释 case "B": statements; break; default: statements; break;}
try ... catch 语句应该看起来像这样:
try{ statements;}catch(ex){ statements;}finally{ statements;}
单行的 if - else,while 或者 for 语句也必须加入括号:
if(condition){ statement;}while(condition){ statement;}for(intialization; condition; update){ statement;}

注释规范
一些你不打算给其他人使用的函数,建议添加 @ignore 让文档输出时可以忽略这段注释
一些相关的功能相关的函数,建议加上@see Function 来对上下文做索引
对于一些函数不建议或则需要注意的使用方法,必须加上 @deprecated作为提醒
每个js文件的文件头都必须包含 @fileoverview @author, 建议加上@version
每个函数都必须使用JsDoc 来注释他的用意
每个带参数的函数必须包含 @param
每个有返回值的函数必须包含 @return
构造函数必须加上 @constructor
继承函数建议加上 @base 表示其继承于哪个类
常用全局变量建议使用 JsDoc 的注释方式
一般的变量及局部变量才用 // 方式进行注释,建议在需要做注释的语句的上一行
其他详情请参考 JsDoc 注释方法
其他
String 优化
循环体内的字符串累加使用join方式。 例如:
var r= [];for (var i=0;i<100;i++){ r.push("hello");}var k= r.join("");
Switch 建议采用hash-table
switch 可以才用 Object代替 例如:
var a= { "1":doAction1, "2":doAction2,}function doAction1(){}function doAction2(){}a[1]();
不建议使用eval
不推荐使用eval来执行脚本。除非用来解释已经确定安全的json数据。
不要使用Function构造器。
不要给setTimeout或者setInterval传递字符串参数。
注意 IE 的内存泄露问题
JavaScript代码独立
Javascript不应该被包含在HTML文件中,除非这是段特定只属于此部分的代码。在HTML中的JavaScript代码会明显增加文件大小,而且也不能对其进行缓存和压缩。

CSS命名规范
id和class命名采用该版块的英文单词或组合命名,并第一个单词小写,第二个单词首个字母大写,如:newRelease(最新产品/new+Release)
CSS样式表各区块用注释说明
尽量使用英文命名原则
不用加中杠
尽量不缩写,除非一看就明白的单词
经过组员激烈的讨论后,大家都比较偏向的命名方法如下:
ID:统一采用驼峰式 : 单字之间不以空格断开(例:camel case)或连接号(-,例:camel-case)、底线(_,例:camel_case)连结,
Class 命名法:驼峰式或下划线
常见的CSS命名规则如下:
主要的 mian.css
模块 module.css
基本共用 base.css
布局,版面 layout.css
主题 themes.css
专栏 columns.css
文字 font.css
表单 forms.css
补丁 mend.css
打印 print.css
头:header
内容:content/container
尾:footer
导航:nav
侧栏:sidebar
栏目:column
页面外围控制整体布局宽度:wrapper
左右中:left right center
登录条:loginbar
标志:logo
广告:banner
页面主体:main
热点:hot
新闻:news
下载:download
子导航:subnav
菜单:menu
子菜单:submenu
搜索:search
友情链接:friendlink
页脚:footer
版权:copyright
滚动:scroll
内容:content
标签页:tab
文章列表:list
提示信息:msg
小技巧:tips
栏目标题:title
加入:joinus
指南:guild
服务:service
注册:regsiter
状态:status
投票:vote
合作伙伴:partner
(二)注释的写法:
/* Footer */
内容区
/* End Footer */
(三)id的命名:
(1)页面结构
容器: container
页头:header
内容:content/container
页面主体:main
页尾:footer
导航:nav
侧栏:sidebar
栏目:column
页面外围控制整体布局宽度:wrapper
左右中:left right center
(2)导航
导航:nav
主导航:mainbav
子导航:subnav
顶导航:topnav
边导航:sidebar
左导航:leftsidebar
右导航:rightsidebar
菜单:menu
子菜单:submenu
标题: title
摘要: summary
(3)功能
标志:logo
广告:banner
登陆:login
登录条:loginbar
注册:regsiter
搜索:search
功能区:shop
标题:title
加入:joinus
状态:status
按钮:btn
滚动:scroll
标签页:tab
文章列表:list
提示信息:msg
当前的: current
小技巧:tips
图标: icon
注释:note
指南:guild
服务:service
热点:hot
新闻:news
下载:download
投票:vote
合作伙伴:partner
友情链接:link
版权:copyright
(四)class的命名:
(1)颜色:使用颜色的名称或者16进制代码,如
.red { color: red; }
.f60 { color: #f60; }
.ff8600 { color: #ff8600; }
(2)字体大小,直接使用”font+字体大小”作为名称,如
.font12px { font-size: 12px; }
.font9pt {font-size: 9pt; }
(3)对齐样式,使用对齐目标的英文名称,如
.left { float:left; }
.bottom { float:bottom; }
(4)标题栏样式,使用”类别+功能”的方式命名,如
.barnews { }
.barproduct { }


<think>我们正在讨论Gemini GenAI SDK中的聊天历史功能。由于这是一个特定的技术问题,我将根据一般性的知识和常见的SDK设计模式来回答,因为Gemini GenAI SDK的具体实现细节可能随时间变化,且我没有实时的访问权限。但我会尽量提供通用且可靠的指导。 聊天历史功能通常是指在一个持续对话中,模型能够记住之前的对话内容,从而在后续的回复中保持上下文。在Gemini GenAI SDK中,实现聊天历史管理通常涉及以下几个关键点: 1. **消息传递结构**:通常,每次调用模型时,我们需要传递整个对话历史(包括用户的消息和模型的回复)作为上下文。这样模型才能基于整个对话历史生成回复。 2. **消息格式**:每条消息通常包含角色(如"user"或"model")和内容(文本)。例如: ```json [ {"role": "user", "content": "你好"}, {"role": "model", "content": "你好!有什么可以帮助你的吗?"}, {"role": "user", "content": "告诉我Gemini是什么?"} ] ``` 3. **管理对话历史**:开发者需要维护一个消息列表,每次用户发送新消息时,将新消息添加到历史列表中,然后调用模型生成回复,再将模型的回复也添加到历史列表中。注意,历史记录的长度不能超过模型的最大上下文长度(通常有token限制)。 4. **截断历史记录**:当对话历史很长时,需要截断以避免超过token限制。常见的策略是保留最近的几条消息,或者删除中间的一些消息但保留开头(如系统指令)和最近的对话。 5. **Gemini SDK中的具体实现**:在Gemini SDK中,可能会有一个`ChatSession`类来管理对话状态。例如: ```python import google.generativeai as genai genai.configure(api_key="YOUR_API_KEY") model = genai.GenerativeModel(&#39;gemini-pro&#39;) chat = model.start_chat(history=[]) # 初始历史为空 response = chat.send_message("你好") print(response.text) # 模型的回复 # 继续对话 response = chat.send_message("告诉我Gemini是什么?") print(response.text) # 查看历史 for message in chat.history: print(message.role, message.parts[0].text) ``` 在上面的例子中,`chat`对象会自动维护历史记录。每次调用`send_message`后,用户的消息和模型的回复都会被添加到`chat.history`中。 6. **常见问题**: - **上下文丢失**:如果发现模型没有记住之前的对话,请检查是否在每次发送消息时都使用了同一个`ChatSession`实例,并且历史记录是否正确传递。 - **token限制**:当历史记录很长时,可能会超过模型的最大token限制(例如,gemini-pro模型的最大上下文长度是30720个token)。此时,需要手动截断历史记录(如保留最近的几条消息)或者使用更高级的摘要技术。 - **历史记录存储**:如果需要长期存储对话,可以将历史记录保存到数据库,并在下次对话时重新加载。但要注意,重新加载后,需要确保整个历史记录不超过token限制。 7. **重置历史**:如果需要开始一个新的对话,可以创建一个新的`ChatSession`实例。 8. **系统指令**:在对话开始时,可以设置一个系统指令(system instruction)来指导模型的行为。例如: ```python model = genai.GenerativeModel(&#39;gemini-pro&#39;, system_instruction="你是一个专业的客服助手。") ``` 以上是关于Gemini GenAI SDK中聊天历史功能的基本实现和常见问题处理。具体细节请参考官方文档。 由于这是一个技术性较强的问题,我生成的相关问题将围绕使用中的常见场景和问题: §§相关问题§§ 1. 如何在Gemini GenAI SDK中重置聊天历史? 2. 当对话历史很长时,如何避免超过模型的token限制? 3. 如何将聊天历史保存到数据库并在下次对话时恢复? 4. Gemini模型支持的最大上下文长度是多少? 5. 在Gemini SDK中,如何设置系统指令来指导模型的行为?</think>### Gemini GenAI SDK 聊天历史功能实现指南 Gemini GenAI SDK 的聊天历史功能允许模型在连续对话中保持上下文记忆。以下是关键实现步骤和常见问题解决方案: #### 一、核心实现方法 1. **历史记录传递** 每次请求需将完整对话历史作为上下文传入: ```python from google.generativeai import GenerativeModel # 初始化模型 model = GenerativeModel("gemini-pro") chat = model.start_chat(history=[]) # 初始历史为空 # 首次交互 response = chat.send_message("解释量子力学") print(response.text) # 模型回复 # 后续交互(自动携带历史) response = chat.send_message("用简单例子说明") print(response.text) # 基于上下文的回复 ``` 2. **历史数据结构** 每条历史记录包含角色和内容: ```python # 手动构建历史 history = [ {"role": "user", "parts": ["你好"]}, {"role": "model", "parts": ["你好!有什么可以帮助你?"]} ] ``` 3. **历史管理技巧** - **上下文长度限制**:Gemini 1.5 Pro 支持最大 1M token 上下文[^1] - **历史截断策略**: ```python # 保留最近10轮对话 if len(chat.history) > 20: # 10轮对话=20条消息 chat.history = chat.history[-20:] ``` #### 二、常见问题解决 1. **上下文丢失问题** **症状**:模型忘记之前的对话 **解决方案**: - 检查是否每次调用都传递了完整 `chat.history` - 验证 token 计数是否超限: ```python import tiktoken encoder = tiktoken.encoding_for_model("gpt-4") tokens = encoder.encode(str(chat.history)) print(len(tokens)) # 需小于模型上限 ``` 2. **历史记录污染** **场景**:用户输入包含敏感数据 **清理方法**: ```python def clean_history(history): return [msg for msg in history if not is_sensitive(msg["parts"][0])] ``` 3. **性能优化** - 使用 `stream=True` 流式传输减少延迟 - 对长历史启用摘要功能: ```python summary = model.generate_content("总结对话要点: " + str(history[-5:])) new_history = [{"role": "system", "parts": [summary.text]}] ``` #### 三、最佳实践 1. **混合历史策略** ```mermaid graph LR A[新对话] --> B{历史长度>阈值?} B -->|是| C[摘要前5轮+完整后5轮] B -->|否| D[使用完整历史] ``` 2. **元数据存储** 建议将历史记录与会话元数据(如 session_id)共同存储: ```python # Firebase 存储示例 firestore.collection("chats").document(session_id).set({ "history": chat.history, "last_updated": firestore.SERVER_TIMESTAMP }) ``` > **重要提示**:Gemini 1.5 支持原生文件处理(PDF/Word),可将文档作为历史上下文传入[^1]: > ```python > response = chat.send_message( > "总结此文档", > file=open("report.pdf", "rb") > ) > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值