giovedì 4 agosto 2011

Contare linee di codice C#

Generalmente non serve a molto sapere quante righe di codice abbiamo implementato, tuttavia potrebbe essere un buon esericizio scoprire quanto riusciamo a produrre.

Generalmente questa statistica ha valore in progetti grossi con team numerosi, in modo da poter monitorare il crescere della soluzione.

Dal mio canto sapere quanto è stato fatto e generalmente in quanto tempo mi può dare qualche informazione in più sul come strutturare eventuali lavori.

Quello che vi propongo è una banale console application da cui partire, va da se che tutto è migliorarbile.

Non pensiate che vi dia tutto ma proprio tutto, conta solo le righe che ci sono in un file con una data estensione.. uno furbo potrebbe fare un file di 10k righe e mostrare quindi al suo capo che ha lavorato come un pazzo !!!


using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Text;

namespace SolutionLineEffort
{
class Program
{
public static int TotalDirecorties = 0;
public static int TotalFiles = 0;
public static int TotalLines = 0;

static void Main(string[] args)
{

File.Delete("d:/analisys.txt");

string[] dr = Directory.GetDirectories(args[0]);

DoWriteIO("Start Analisys from:" + args[0] + " at :" +
DateTime.Now.ToLongTimeString());


for (int i = 0; i < dr.Length; i++)
{
DoTrace(dr[i], 1);
}


DoWriteIO("---------------------------------------------------");
DoWriteIO("\tTotal Folders:" + TotalDirecorties.ToString());
DoWriteIO("\tTotal Files :" + TotalFiles.ToString());
DoWriteIO("\tTotal Lines :" + TotalLines.ToString());
DoWriteIO("\tLinesxFiles :" + (TotalLines/TotalFiles).ToString());
DoWriteIO("---------------------------------------------------");
DoWriteIO("End Analisys from:" + args[0] + " at :" +
DateTime.Now.ToLongTimeString());

Console.ReadLine();
}

static void DoTrace(string folder, int stack)
{

string[] subfolders = Directory.GetDirectories(folder);

if (subfolders.Length == 0)
{
ProcessFolder(folder, stack);

}
else
{
for (int i = 0; i < subfolders.Length; i++)
{
DoTrace(subfolders[i], stack++);
}

ProcessFolder(folder,stack);
}
}

static void ProcessFolder( string folder,int stack)
{

//files
string[] files = Directory.GetFiles(folder, "*.cs");
//pages
string[] pages = Directory.GetFiles(folder, "*.aspx");
//controlli
string[] wucs = Directory.GetFiles(folder, "*.ascx");
// web services
string[] asmx = Directory.GetFiles(folder, "*.asmx");


string layout = "";
if (files.Length > 0)
{
layout = "".PadLeft(stack, '-');
DoWriteIO(layout + folder);
TotalDirecorties++;

CountFiles(files, layout);
}
if (pages.Length > 0)
{
layout = "".PadLeft(stack, '-');
DoWriteIO(layout + folder);
TotalDirecorties++;

CountFiles(pages, layout);
}

if (wucs.Length > 0)
{
layout = "".PadLeft(stack, '-');
DoWriteIO(layout + folder);
TotalDirecorties++;

CountFiles(wucs, layout);
}

if (asmx.Length > 0)
{
layout = "".PadLeft(stack, '-');
DoWriteIO(layout + folder);
TotalDirecorties++;

CountFiles(asmx, layout);
}
}

static void CountFiles(string[] files, string layout)
{
for (int i = 0; i < files.Length; i++)
{
if (!files[i].ToLower().Contains("designer"))
{
TextReader tr = new StreamReader(files[i]);
string[] lines = tr.ReadToEnd().Split(new char[] { '\n' });
tr.Close();

TotalFiles++;
TotalLines = TotalLines + lines.Count();

DoWriteIO(layout + files[i]);
}
}
}

static void DoWriteIO(string message)
{
TextWriter tw = new StreamWriter("d:/analisys.txt", true);
tw.WriteLine(message);
tw.Close();
Console.WriteLine(message);
}
}
}


Scoprirete che a volte vi sarà parso di aver fatto molto meno di quanto vi siete immaginati !!

Nessun commento: