Skip to main content

Software Engineering - Continues refinement

Every programmer wishes to write some code, which is both elegant, and readable. A master piece to reference to...
And there may not be a single programmer, who said at least once in their life time that, "If I had time, I'd rewrite it" or any similar one.

Today, let's discuss, how the idea of sorting a list of list went on,  

I had to sort a list of lists, that's the result of a search, comes from Web Service. After that, the result is extracted from the XML document that's returned and formatted for front end. So, now all the data is in the form of strings. And I'm ended up with the task of sorting a list of list of strings, based on different items in the inner lists @ different times. And Obviously we can't compare the data as strings, we have to convert them into their proper data type before comparison.

Since, I works on a Python based project, First thing, that came to mind is to use, sorted inbuilt function, and pass it a function to compare. But the new way of doing this pass a function to key argument of sorted instead of cmp argument.

This is a bad idea, that we are doing array sub-scripting on the lambda itself. Which is a lot inflexible. A quick visit to python wiki showed me, how to convert a cmp to key argument. This is more flexible, Now I can tell, which column to sort, how to convert that particular column to proper data type etc.
Now, compare() is a very simple function, which I don't have to define separately, so I put that into cmp_to_key() function as a default parameter, a lambda.
 
But, hold on, Why should we create a lambda, if we can do that comparison directly, without creating a function first? So, our lambda got removed and comparison is performed directly on __lt__ special function
 
Ok, now we are in good shape. Now, we can shift our focus into, How to specify a a function, which will convert a string in the lists to a proper data type. I'm using DataTables jQuery plugin for client side display of paginating table. So, what I get back to server to determine column is a number. So, I made a list, which I can map to in sorting function based on which column to sort.

Here, we are making a lot of repetitions, with DRY principle in mind, I decided to normalize those, like Database normalizations, you can say. But there's another reason for the decision, we have another type of searches, whose return records varies, and in effect will create a lot of duplicates of anonymous functions which does same thing. So here goes the solution

Here goes final solution, bear in mind this is simplified version, I removed all the complexities and simplifications involved, because of Classes, packages, etc., which is there in real system. But, I do believe, this shows how a piece of code evolved to solve a problem, And why it took time and knowledge to become perfect / or near perfect.
NB: sorted function uses a condition at end to assign a value to reverse, which is actually a Boolean. That single statement alone undergone a lot of transformation in the process. Well, that's for another blog entry.

Comments

Popular posts from this blog

Correct way to structure your Django 1.4 projects

PS: This post is written assuming you're familiar with Django and at-least have some basic experience trying to set-up a Django project (for learning or for some cool project). Purpose: To show how to properly set-up your Django1.4 project after seeing other developers getting it wrong (seen it wrongly structured by my mentee, senior developers and junior developers at my firm.). Django 1.3 Project structure: Initial structure followed by two apps added to the project. Refer above picture, where I shown a Django < 1.4 project structure. (I know, at least Django 1.2 & 1.3 follows this structure). First tree view is of the initial structure that you will get by calling $ django-admin startproject Proj Take a note that manage.py, settings.py, urls.py are in the main folder. Following  tree display is after creating two apps named app1 & app2. You'll do it as follows $ ./manage.py startapp app1 $ ./manage.py startapp app2 Those apps are c

AJAX File Upload with Web2py

It was not that long, since I experienced a problem while trying to upload a file using an ajax  trapped form. I thought, it must be me doing something wrong. I was using web2py  to embed another page into a page via ajax. That is better known to web2py folk as LOADing a component. It's just happened that one of such component contains a file upload form. It was my first time using LOAD function provided by web2py. Basically it make use of jQuery to load the page via ajax into a target div and traps input of any form in that page, so that page doesn't reload. Oh, I forgot to say that web2py is bundled with jQuery. It's always boring and tedious to understand a problem without experiencing it. So, Let's play with an example, (PS: I"m using web2py a full stack python framework, but you can use any language at server side and this problem will be there because, it's a problem with ajax) My model which defines table like this, In RDBMS world, it column 

Set difference: Data provided from two big files with one number at a line

Today, I had to find out difference between two huge lists of numbers. Numbers are 17 digits long and list are of around 1 lac. PS: I'm documenting both versions here for my future reference. I used python, because diff doesn't felt good for me. because it will print both ins and outs of both files. Also, I ruled out diff's possibility, because I didn't felt it will work at that time. Later, at home: I give diff a try. Yes, it's not that beautiful as in python. I'd cut and sed a bit. But still, it's a "one liner" and I like 'em a lot.