如何以专业的方式编码?

时间:2009-09-13 10:06:10

标签: coding-style

我很想知道,如何以完美的专业风格编写程序。  很多时候我们编写了一个非常好的程序/代码来提供准确的输出。一个人可能会使用最好的算法来解决给定的问题。

但对于正在阅读您的代码以供其参考的人,由于不正确使用变量/函数名称而难以理解代码。(以及许多其他问题)

那么如何以专业的方式实现编写代码的完美程度呢?

您可以直接编辑以下代码来详细说明您的想法。 (不要编辑问题中的代码:)

你也可以用专业的方式在最后重写完整的代码。会有很多帮助。

(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;

}

8 个答案:

答案 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)

以下是一些明智的变化,因此可能因人而异,但要保持一致。

  • 在文件顶部添加评论
  • 逗号后添加空格,例如swap(int *,int *); - &GT; swap(int *,int *);
  • 在for循环中以分号后添加空格
  • 在运营商之前和之后添加空格,例如'=','+',' - '
  • 在大括号和主
  • 之后删除不必要的空格
  • 明确所以在每个for循环中添加大括号{}
  • 按照换行符对组内的代码行和单独的组进行分组
  • 从同一列开始while loop brace

这是修改后的代码

#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 五