大家好,才是真的好。
在编写LotusScript时考虑性能问题,尤其是大量数据处理时,前面我们提得也比较多,例如在循环文档时,尽量不使用getNthdocument,而使用getNextDocument等。
今天我们介绍的是LS编程技巧,就是非必要时,不使用对象。
举个例子,你访问网页时,网页下面有一个大图片,你不拉到该图片位置时,该图片不会从服务器上请求加载。
这种就是网页上常见的““lazy loading” 技术。
其实在LotusScript中也可以考虑这样做,即在非必要前不做额外工作,可以加快初始化速度,也可以节省一些性能,避免耗时操作。
例如使用当前文档,你可能不需要在视图中查找文档。
在第一次使用视图前,不需要打开视图和创建NotesView对象等;打开视图后,在完成操作前,不要丢弃视图对象;也可以使用视图缓存,除非需要更新等。
这里有一段分享的代码案例,在自定义的LotusScript类实现了上述操作原则,可供大家参考:
Class ProjectDocument
Private z_db As NotesDatabase
Private z_docProject As NotesDocument
'定义其他变量
Private z_IDView As NotesView
%REM
Property IDView (read)
描述:获取按ID排序的视图ProjectsByID,Autoupdate为false设置为视图不刷新
如果需要刷新,通过下面的IDViewUpdate方法来执行操作
%END REM
Public Property Get IDView As NotesView
If z_IDView Is Nothing Then
Set z_IDView = z_db.Getview("ProjectsByID")
z_IDView.Autoupdate = False
End If
Set IDView = z_IDView
End Property
%REM
Sub IDViewUpdate
Description: 确保视图索引都是最新的。
%END REM
Sub IDViewUpdate
If Not z_IDView Is Nothing Then
z_IDView.Refresh
End If
End Sub
%REM
Function isIDUnique
Description: 确定用户建议的ID是否已在使用中。
Arguments:
ID: 需要检查的文档ID
Returns: 如果ID是唯一,则返回TRUE
%END REM
Function isIDUnique(ByVal ID$) As Boolean
Dim docsWithID As NotesViewEntryCollection
Set docsWithID = IDView.Getallentriesbykey(ID, True)
If docsWithID.Count > 1 Then Exit Function ' returning False
If docsWithID.Count = 1 Then
Dim ent As NotesViewEntry
Set ent = docsWithID.Getfirstentry
If ent.Noteid <> z_docProject.noteid Then Exit Function
' 另一个文档已经使用该ID
End If
isIDUnique = True
End Function
%REM
Sub Save
Description: 保存对象关联的Project文档
Arguments:
%END REM
Sub Save
Call z_docProject.Save(True, False, True)
IDViewUpdate
'视图更新,保存的文档会出现在更新后的视图
End Sub
End Class
上述技术不仅可以使用到视图,也可以使用到简要表或某些值的计算中等等。
原文载于https://lotusscript.torknado.com/blog/lazy-code/
如有兴趣,欢迎查看原文。
今天就介绍到这里吧。更多文章请关注微信公号:协作者