如何在PHP项目中找到任何未使用的函数?
是否有功能或API内置到PHP,让我分析我的代码库-例如反射,token_get_all()
?
这些API功能是否足够丰富,我不必依赖第三方工具来执行此类分析?
如果有人能够根据Visual Studio的Code Metrics规则向我解释以下两段代码之间的区别,我将不胜感激.如果我不将所有内容封装在内,为什么可维护性指数会略有增加using ( )
?
样本1(MI分数为71)
public static String Sha1(String plainText)
{
using (SHA1Managed sha1 = new SHA1Managed())
{
Byte[] text = Encoding.Unicode.GetBytes(plainText);
Byte[] hashBytes = sha1.ComputeHash(text);
return Convert.ToBase64String(hashBytes);
}
}
Run Code Online (Sandbox Code Playgroud)
样本2(MI分数为73)
public static String Sha1(String plainText)
{
Byte[] text, hashBytes;
using (SHA1Managed sha1 = new SHA1Managed())
{
text = Encoding.Unicode.GetBytes(plainText);
hashBytes = sha1.ComputeHash(text);
}
return Convert.ToBase64String(hashBytes);
}
Run Code Online (Sandbox Code Playgroud)
我理解指标在更广泛的背景和理解之外是没有意义的,程序员应该行使自由裁量权.虽然我可以将分数提高到76 return Convert.ToBase64String(sha1.ComputeHash(Encoding.Unicode.GetBytes(plainText)))
,但我不应该.我显然只是在玩数字,而且在那一点上它并不是真正的可读性或可维护性.我很好奇这个案例增加背后的逻辑是什么.这显然不是行数.
我一直在努力处理NullReferenceException并希望有人能指出我正确的方向.我正在尝试创建并填充DataTable,然后在DataGridView控件中显示结果.接下来是基本代码,Execution在我调用新的UpdateResults_Delegate时停止并显示NullReferenceException.奇怪的是,我可以在从QueryEventEntries返回之前成功跟踪entries.Rows.Count,所以我至少可以显示1)条目不是空引用,2)DataTable包含数据行.我知道我必须做错事,但我不知道是什么.
private void UpdateResults(DataTable entries)
{
dataGridView.DataSource = entries;
}
private void button_Click(object sender, EventArgs e)
{
PerformQuery();
}
private void PerformQuery()
{
DateTime start = new DateTime(dateTimePicker1.Value.Year,
dateTimePicker1.Value.Month,
dateTimePicker1.Value.Day,
0, 0, 0);
DateTime stop = new DateTime(dateTimePicker2.Value.Year,
dateTimePicker2.Value.Month,
dateTimePicker2.Value.Day,
0, 0, 0);
DataTable entries = QueryEventEntries(start, stop);
UpdateResults(entries);
}
private DataTable QueryEventEntries(DateTime start, DateTime stop)
{
DataTable entries = new DataTable();
entries.Columns.AddRange(new DataColumn[] {
new DataColumn("event_type", typeof(Int32)),
new DataColumn("event_time", typeof(DateTime)),
new DataColumn("event_detail", typeof(String))});
using (SqlConnection conn = new SqlConnection(DSN)) …
Run Code Online (Sandbox Code Playgroud) 我该如何从列表中删除给定元素?举个例子,假设我有列表['A'; 'B'; 'C'; 'D'; 'E']
并希望删除索引2处的元素以生成列表['A'; 'B'; 'D'; 'E']
?我已经编写了以下代码来完成任务,但是当我已经知道索引时,遍历列表的开头似乎效率很低.
let remove lst i =
let rec remove lst lst' =
match lst with
| [] -> lst'
| h::t -> if List.length lst = i then
lst' @ t
else
remove t (lst' @ [h])
remove lst []
let myList = ['A'; 'B'; 'C'; 'D'; 'E']
let newList = remove myList 2
Run Code Online (Sandbox Code Playgroud)
或者,我应该如何在给定位置插入元素?我的代码与上面的方法类似,也很可能效率低下.
let insert lst i x =
let rec insert lst lst' =
match lst …
Run Code Online (Sandbox Code Playgroud) 当我通过Visual Studio的代码分析实用程序运行一些代码时,我收到一个警告,我不确定如何解决.也许这里的某个人遇到了类似的问题,解决了这个问题,并愿意分享他们的见解.
我正在编写DataGridView控件中使用的自定义绘制单元格.代码类似于:
public class DataGridViewMyCustomColumn : DataGridViewColumn
{
public DataGridViewMyCustomColumn() : base(new DataGridViewMyCustomCell())
{
}
Run Code Online (Sandbox Code Playgroud)
它会生成以下警告:
CA2000:Microsoft.Reliability:在方法'DataGridViewMyCustomColumn.DataGridViewMyCustomColumn()'中,在对所有引用超出范围之前,对对象'new DataGridViewMyCustomCell()'调用System.IDisposable.Dispose.
我知道它警告我DataGridViewMyCustomCell(或它继承自的类)实现了IDisposable接口,并且应该调用Dispose()方法来清理DataGridViewMyCustomCell声明的任何资源.
我在互联网上看到的示例建议使用块来限制对象的生命周期并让系统自动处理它,但是当移动到构造函数的主体中时无法识别base,因此我无法编写使用阻止它...我不确定我还想要做什么,因为不会指示运行时释放仍然可以在以后在基类中使用的对象?
我的问题是,代码是否正常?或者,如何重构以解决警告?除非确实合适,否则我不想压制警告.
我观看了John Resig 在JavaScript库设计演示中的最佳实践 ; 一张幻灯片建议"调整"对象构造函数,以便实例化它自己.
function jQuery(str, con) {
if (window === this) {
return new jQuery(str, con);
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
new jQuery("#foo")
随之而来的,变成了jQuery("#foo")
.
我认为这很有趣,但我没有在我自己的代码中编写类似的构造函数.
过了一会儿,我在这里看了一篇文章.(对不起,我不记得哪个或者我提供了一个链接.我会更新问题,如果我能再次找到它.)其中一条评论说这样做是不好的做法躲避new
程序员,但没有详细说明.
我的问题是,上述一般认为好,坏,或无动于衷,为什么?
阅读http://golang.org/doc/effective_go.html#arrays上的以下内容......
- 数组是值.将一个数组分配给另一个数组会复制所有元素.
- 特别是,如果将数组传递给函数,它将接收数组的副本,而不是指向它的指针.
......我希望在下面的代码arr2
是从不同的arr
,和main()
的arr
是从不同shuffle()
的arr
.有人可以解释为什么以下代码洗牌arr2
?我知道围棋还是一种年轻的语言; 也许阵列的处理有所改变?
package main
import (
"fmt"
"rand"
"time"
)
func shuffle(arr []int) {
rand.Seed(time.Nanoseconds())
for i := len(arr) - 1; i > 0; i-- {
j := rand.Intn(i)
arr[i], arr[j] = arr[j], arr[i]
}
}
func main() {
arr := []int{1, 2, 3, 4, 5}
arr2 := arr
shuffle(arr)
for _, i := range arr2 {
fmt.Printf("%d ", i)
} …
Run Code Online (Sandbox Code Playgroud) 我正在研究一种基本的手工编码词法扫描仪,并希望支持UTF-8输入(它不再是1970年了!).输入字符一次读取stdin
一个文件或一个文件,然后推入缓冲区直到看到空白等.我想为自己编写自己的包装器fgetc()
而不是返回char[]
构成UTF-8字符的字节并使用结果作为一个字符串...它很容易,但会变成一个滑坡.我宁愿不浪费时间重新发明轮子,而是使用像ICU这样的现有测试库.所以现在我有一个非UTF-8支持的代码与工作fgetc()
,isspace()
,strcmp()
等我正努力更新使用ICU.这是我第一次尝试使用ICU,并且一直在阅读文档并尝试使用Google代码搜索查找使用示例,但仍然存在一些混淆点,我希望有人能够澄清.
该u_fgetc()
函数返回UChar
,并u_fgetcx()
返回UChar32
...文档建议使用u_fgetcx()
读码点,所以这就是我开始用.我保持与上面相同的方法,但我将UChar32
s 推入缓冲区而不是char
s.
将角色与已知值进行比较的正确方法是什么?最初我能够if (c == '+')
检查加号是否从输入中获取.当GCC不抱怨c
是UChar32
(然后进行比较UChar32
和char
),但是这真的是正确的?
例如,我能够用strcmp()
缓冲的字符与已知值进行比较if ((strcmp(buf, "else") == 0)
.还有就是u_strcmp()
由ICU提供,我想我可能需要使用U_STRING_DECL
和U_STRING_INIT
宏指定已知的文字,但我不能肯定.文档显示它们的结果UChar[]
,但我认为我需要UChar32[]
......而且我不确定如何正确使用它们.这里的任何指导都会受到欢迎.
在阅读了一系列数字字符后,我一直在转换它们,strtol()
所以我可以使用它们.自从我现在转换以来,ICU是否提供了类似的功能UChar32[]
?
c# ×3
php ×2
algorithm ×1
arrays ×1
c ×1
ca2000 ×1
code-metrics ×1
constructor ×1
datagridview ×1
datatable ×1
f# ×1
go ×1
icu ×1
javascript ×1
list ×1
metrics ×1
prolog ×1
refactoring ×1
regex ×1
reliability ×1
utf-8 ×1
winforms ×1