我很想知道,如何以完美的专业风格编写程序。 很多时候我们编写了一个非常好的程序/代码来提供准确的输出。一个人可能会使用最好的算法来解决给定的问题。
但对于正在阅读您的代码以供其参考的人,由于不正确使用变量/函数名称而难以理解代码。(以及许多其他问题)
那么如何以专业的方式实现编写代码的完美程度呢?
您可以直接编辑以下代码来详细说明您的想法。 (不要编辑问题中的代码:)
你也可以用专业的方式在最后重写完整的代码。会有很多帮助。
(C中的简单堆排序算法)
#include<stdio.h>
#include<conio.h>
void insert(int i);
void swap(int *,int *);
void heap_sort(int);
int a[20];
void main()
{
int n,i;
clrscr();
printf("Enter the no of elements : ");
scanf("%d",&n);
printf("\nEnter the elements : \n");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
heap_sort(n);
printf("\nSorted array is : \n");
for(i=0;i<n;i++)
printf("\t%d",a[i]);
getch();
}
void swap(int *p,int *q)
{
int temp;
temp=*p;
*p=*q;
*q=temp;
}
void heap_sort(int n)
{
int x=1,i;
while(x<n)
{
for(i=1;i<=n-x;i++)
insert(i);
swap(&a[0],&a[n-x]);
x++;
}
}
void insert(int i)
{
int j=(i-1)/2,item=a[i];
while((i>0) && (item>a[j]))
{
a[i]=a[j];
i=j;
j=(i-1)/2;
}
a[i]=item;
}
答案 0 :(得分:14)
阅读Code Complete,这是有关此类主题的最佳书籍之一。你不会后悔的。
答案 1 :(得分:5)
看看这个:
void main ()
{
int n, i;
clrscr ();
printf ("Enter the no of elements : ");
scanf ("%d", &n);
printf ("\nEnter the elements : \n");
for (i = 0; i < n; i++)
scanf ("%d", &a[i]);
heap_sort (n);
printf ("\nSorted array is : \n");
for (i = 0; i < n; i++)
printf ("\t%d", a[i]);
getch ();
}
现在好多了,不是吗?
避免使用无意义的单字母变量名称。它们很神秘,并且没有向读者传达任何信息(六个月后也向你自己传达)。
根据需要添加评论。如果您看到某些代码可能不清楚,请对其进行评论。如果您使用某种黑客或技巧,请描述它,它是什么以及为什么需要它。如果您使用某种算法(尤其是数学计算),请参考它。
避免很长的函数体。如果你看到一个函数得到太多的东西,重构它。将共同和重复的部分提取到共享和辅助函数中,以便阅读代码的人可以看到函数的概述。
在代码中避免使用幻数。不要在代码中直接放置一些抽象数字(3,17,135等)。在某处声明常量并在代码中引用它们。这样,它只会对您的代码产生一致的影响。很容易忘记改变......好吧,比如,代码中的26个数字中有3个使用。
文本字符串也是如此。在资源,外部文件中将它们声明为字符串常量并在代码中使用它们。
答案 2 :(得分:2)
支持foreach
语句(等)以使循环的范围变得明显:
for(i=0 ; i<n ; i++)
{
scanf("%d", &a[i]);
}
getch();
(等)。
或许可以在逻辑代码块中添加一些摘要注释;但不是“给我加1”!
答案 3 :(得分:1)
代码应该在没有警告的情况下真正编译
warning: return type of ‘main’ is not ‘int’
使用未指定的参数列表通常不被视为良好做法。
通过类似astyle之类的代码运行代码,它将为您缩进,并添加大括号(如果这是您的风格)。请注意,它被称为“艺术风格”而不是“专业风格”,因为它旨在使代码看起来不错,而且活动很少增加与付费员工一样的成本。
专业人士为此付出了代价。如果你的工作是制作一个尽可能少的一次性程序,那么添加更多注释,使用更多解释变量名称或手动整理格式没有多大意义。文档,设计历史和意图的记录,明确定义的子系统边界在大型系统上都很重要,但它们是管理复杂性的技术。作为一名专业人士,您的工作是以最低的成本增加最多的价值。质量,可维护性和可验证性是价值和功能;重视最重要的组织,将决定你关注的重点。
答案 4 :(得分:1)
我认为,每当编写代码时,您应该牢记在心,对于其他开发人员来说理解它在做什么是多么容易。 一般来说,我建议如下。
基本上,如果它看起来像是一面文字而且 你 发现很难找到它的作用,那么对于那些没有做过的人来说情况会更糟糕写下来。
答案 5 :(得分:1)
以下是一些明智的变化,因此可能因人而异,但要保持一致。
这是修改后的代码
#include<stdio.h>
#include<conio.h>
/********************************************
Write a comment about what this program does.
General overview
*********************************************/
void insert(int i);
void swap(int *, int *);
void heap_sort(int);
int a[20];
void main()
{
int n, i;
clrscr();
printf("Enter the no of elements : ");
scanf("%d", &n);
printf("\nEnter the elements : \n");
for(i=0; i<n; i++)
{
scanf("%d",&a[i]);
}
heap_sort(n);
printf("\nSorted array is : \n");
for(i=0;i<n;i++)
{
printf("\t%d",a[i]);
}
getch();
}
void swap(int *p, int *q)
{
int temp;
temp = *p;
*p = *q;
*q = temp;
}
void heap_sort(int n)
{
int x=1, i;
while(x<n)
{
for(i=1; i<=n-x; i++)
{
insert(i);
}
swap(&a[0], &a[n-x]);
x++;
}
}
void insert(int i)
{
int j = (i - 1) / 2;
int item = a[i];
while((i>0) && (item>a[j]))
{
a[i] = a[j];
i = j;
j = (i - 1) / 2;
}
a[i] = item;
}
答案 6 :(得分:0)
我会在你的句号之后放置空格。
答案 7 :(得分:0)
除了最后一个之外摆脱这些“printfs”肯定会使你的原始程序更专业。 除此之外,专业开发人员通常会在错误处理方面格外小心。例如,如果以下列方式调用程序,该怎么办: a.out&lt; input.lst 其中“input.lst”的内容如下: 10 3 4 五