Showing posts with label Better Coding. Show all posts
Showing posts with label Better Coding. Show all posts

Friday, January 31, 2014

Namespaces in Javascript

Namespacing in Javascript can be achieved in following ways

1. Single global variables
2. Prefix namespacing
3. Object literal notation
4. Nested namespacing
5. Immediately-invoked Function
6. Expressions
7. Namespace injection

Lets go in detail..

Single Global Variables:
Here we define a single Global variable which holds all methods and properties of object.

Ex.
var myExApplication =  (function () { 
        function(){
            //...
        },
        return{
            //...
        }
})();

Disadvantage: There are high chances of conflicts same variable could be used in some other part of code.


Prefix Namespacing:
Here we select a unique prefix namespace we wish to  use (in this example, myExApplication_)  and then define any methods, variables, or other objects after the  prefix as follows

Ex.
var myExApplication_propertyA = {};
var myExApplication_propertyB = {};
function myExApplication_myMethod(){ 
  //...
}

Disadvantage: We may end up having huge number of global variables thus tough manageable code.

Object Literal Notation:
Here an object contains a collection of key-value pairs with a colon separating each pair of keys and values, where keys can also represent new namespaces.

Ex.
var myExConfig = { //myExConfig is a JSON object and it contains all methods and props.

    language: "english",

    defaults: {
        enableGeolocation: true,
        enableSharing: false,
        maxPhotos: 20
    },

    theme: {
        skin: "a",
        toolbars: {
            index: "ui-navigation-toolbar",
            pages: "ui-custom-toolbar"    
        }
    }

}

Nested Namespacing:
Its an extension of Object Literal notation where an object includes another object and which in turn may include another object and so on to achieve a more granular name spacing.

Ex.
var myApp =  myApp || {};

myApp.routers = myApp.routers || {};
myApp.model = myApp.model || {};
myApp.model.special = myApp.model.special || {}


Immediately Invoked Function Expressions (IIFE)s
In IIFEs  an unnamed function is immediately invoked after it’s been defined and a namespace is passed as a parameter to contained objects.

Ex.
var namespace = namespace || {};

// here a namespace object is passed as a function 
// parameter, where we assign public methods and 
// properties to it
(function( o ){    
    o.foo = "foo";
    o.bar = function(){
        return "bar";    
    };
})( namespace );

console.log( namespace );


Namespace Injection:
This is another variation on the IIFE in which we “inject” the methods and properties for a specific namespace from within a function wrapper using this as a namespace proxy 

Ex.
var myApp = myApp || {};
myApp.utils =  {};

(function () {
  var val = 5;

  this.getValue = function () {
      return val;
  };
   
  this.setValue = function( newVal ) {
      val = newVal;
  }
      
  // also introduce a new sub-namespace
  this.tools = {};
    
}).apply( myApp.utils );  

// inject new behaviour into the tools namespace
// which we defined via the utilities module

(function () {
    this.diagnose = function(){
        return "diagnosis";   
    }
}).apply( myApp.utils.tools );

Saturday, April 13, 2013

ASP.Net MVC & ExtJs Grid [with Paging, Remote Soring and Filtering features] & Entity Framework Code First

In this post I am going to show how I created an Ext JS Grid and set up Paging, Remote Sorting and Filter features.

I have shared code at Github, feel free to download it and use it in your project.

In this project I have used Entity Framework code first for data access. After you download project you need to set up DB server name accordingly in Web.Config for application to run successfully.

 


In my solution I have 6 projects which, which are described as below:
1)MvcApplication.Core : It contains all core classes which will be used by other layers.
2)MvcApplication.DAL : It contains Models, Repository, DB context which is used by Main Application.
3)NewMvcApplication : Its main application which has a Person page that shows all persons.

Others are Test projects , as I have not written any Unit Test, I wont be discussing about them.

Once you run application first time , It will create all Tables and DB, once the DB is created you can insert some dummy data in your table.

Now I am going to discuss main components of my solution.
1) Persongrid.js  : It contains Javascript code which creates Person grid and sets up filter, Paging toolbar which is used by Grid. Here is the content of that file, As you can see here first I am creating a Data store, then using that Data store to create my ExtJs grid. I am also creating Paging toolbar to show my page numbers. I also specify filter information while defining columns.


Ext.Loader.setConfig({ enabled: true });

Ext.require([
    'Ext.grid.*',
    'Ext.data.*',
    'Ext.ux.grid.FiltersFeature',
    'Ext.toolbar.Paging',
    'Ext.ux.ajax.JsonSimlet',
    'Ext.ux.ajax.SimManager'
]);


Ext.onReady(function () {

    Ext.define('Person', {
        extend: 'Ext.data.Model',
        fields: [
        { name: 'FirstName', type: 'string' },
        { name: 'FirstName', type: 'string' },
        { name: 'MI', type: 'string' },
        { name: 'LastName', type: 'string' },
        { name: 'FaceBookId', type: 'string' },
        { name: 'Email', type: 'string' },
        { name: 'TwitterId', type: 'string' },
        { name: 'LinkedInId', type: 'string' },
        { name: 'BlogUrl', type: 'string' }
        ]
    });

    var store = Ext.create('Ext.data.Store', {
        model: 'Person',
        remoteSort: true,
        proxy: {
            type: 'ajax',
            url: '/Person/ListExtJs',
            reader: {
                type: 'json',
                root: 'data',
                totalProperty: 'totalCount'
            }
        },
        autoLoad: true,
        
    });

    // configure whether filter query is encoded or not (initially)
    var encode = true;

    // configure whether filtering is performed locally or remotely (initially)
    var local = true;

    var filters = {
        ftype: 'filters',
        encode: encode, 
        local: false
    };

    var grid = new Ext.grid.GridPanel({
        store: store,
        columns: [
           { header: 'Id', dataIndex: 'Id', hidden: true},
           { header: 'First Name', dataIndex: 'FirstName', width: 100, filterable:true },
           {
               header: 'Middle Initial', dataIndex: 'MI', width: 100
           },
           { header: 'Last Name', dataIndex: 'LastName', width: 100 },
           {
               header: 'FaceBook Id', dataIndex: 'FaceBookId', width: 100,
               filter: {
                   type: 'string'
                   // specify disabled to disable the filter menu
                   //, disabled: true
               }
           },
           {
               header: 'Email', dataIndex: 'Email', width: 100,
               filter: {
                   type: 'string'
                   // specify disabled to disable the filter menu
                   //, disabled: true
               }
           },
           {
               header: 'TwitterId', dataIndex: 'TwitterId', width: 100,
               filter: {
                   type: 'string'
                   // specify disabled to disable the filter menu
                   //, disabled: true
               }
           },
           { header: 'LinkedInId', dataIndex: 'LinkedInId', width: 100 },
           { header: 'BlogUrl', dataIndex: 'BlogUrl', width: 200 }
        ],
        
        renderTo: 'grid',
        width: 1000,
        autoHeight: true,
        bbar: new Ext.PagingToolbar({
            store: store,
            pageSize: 5,
            displayInfo: true,
            displayMsg: 'Displaying employees {0} - {1} of {2}',
            emptyMsg: "No employees to display"
        }),
        pageSize: 25,
        title: 'Employees',
        features: [filters],
    });
                
    grid.getStore().load({ params: {
        start: 0,
        limit: 25
    }
    });
});


2) I have added following method in my Person controller, here I am based on requested data I use filter and  sort data to return requested data.


      public ActionResult ListExtJs(int start, int limit,string sort, string filter)
        {
            int totalcount = db.Persons.Count();
            List<FilterData> filters;
            List<SortData> sorts;
            List<Person> persons;

            filters = FilterData.GetData(filter);
            sorts = SortData.GetData(sort);
            if (sorts.Count() == 0)
            {
                sorts.Add(new SortData() { direction = "ASC", property = "FirstName" });
            }
            string sortproperty = sorts[0].property;
            string sortdirection = sorts[0].direction;

            persons = db.Persons.Where(FilterData.GetWhereCriteria(filters)).OrderBy(sortproperty + " " + sortdirection).Skip(start).Take(limit).ToList();
            
            return Json(new { data = persons.ToArray(), totalCount = totalcount }, JsonRequestBehavior.AllowGet);

        }


3) I have created FilterData and SortData classes which are present in MvcApplication.Core they are class representation of data passed from ExtJs grid while loading data.



You can download this code from github using this link.

Saturday, March 30, 2013

Generating KnockOut ViewModel from a sql table

Here is the script that can be used to generate a Knockout V.M. from a table




DECLARE @TableName VARCHAR(100) = 'Persons'
DECLARE @ShortTableName varchar(100) = 'person'
DECLARE @TableSchema VARCHAR(3) = 'dbo'
DECLARE @result varchar(max) = ''


SET @result = @result + CHAR(13)


SET @result = @result + 'var ' + @TableName +  'VM = function('+ @ShortTableName +'){' + CHAR(13)

set @result = @result + 'var self = this ;' + char(13)

SELECT @result = @result + CHAR(13)
     + 'self.' + ColumnName + ' = ko.observable(' + @ShortTableName + ' ? ' + @ShortTableName +'.' +ColumnName +' : '''');' + CHAR(13)
FROM
(
    SELECT  c.COLUMN_NAME   AS ColumnName
        , 'var' AS ColumnType
        , c.ORDINAL_POSITION
FROM    INFORMATION_SCHEMA.COLUMNS c
WHERE   c.TABLE_NAME = @TableName and ISNULL(@TableSchema, c.TABLE_SCHEMA) = c.TABLE_SCHEMA
) t
ORDER BY t.ORDINAL_POSITION


SET @result = @result  + '}' + CHAR(13)



PRINT @result



Tuesday, March 26, 2013

Frequently Used JQuery functions for select list


Clearing a Select list:
$("#select_list_name").empty();


Adding an option in Select List:
$("# select_list_name ").append($('<option>', {
                            value: value_to_add,
                            text: text_to_add
                        }));
Here ‘value_to_add’ & text_to_add aer values that you want to be added.



To Check if an option exist by value in a Select List:
if ($('#select_list_name).find('option[value=' + value_to_search + ']').length > 0)
{
       //When an Item exist
}

Here value_to_search is the value that you want to searched in select list.


To select a particular value in select list after you find it:
$('#select_list_name).find('option[value=' + value_to_search + ']').attr("selected", "selected");


To read a selected value:
var selectedvalue = $("#select_list_name option:selected").val();


To set Margin value & Width for select list:
$('#select_list_name').css('margin-left', '5px');
$('#select_list_name ').css('width', (window.screen.width * 0.14) + 'px');

Friday, February 22, 2013

Setting up NAnt on your pc/server

In this post we are going to see how to set up NANT on your PC/Server. Its first step towards Build Automation.



1.       Download Nant Binaries from http://nant.sourceforge.net/


2.       Once you download all Binary files, right click on Zip file and open Properties as show below


3.       Once properties window opens click on Unblock button as shown below



4.       Now unzip the Zipped file contents at some preferred location for eg. C:\Program Files (x86)\ Nant, as show below.




5.       Now go to “My Computer “ => “Advanced System Settings” => “Environment Variables”
And add following “System variable” as shown below


6.       Edit “Path” Variable in System Variables section as show below, append newly added system variable in your existing paths

 

7.       Open a command prompt and type “Nant – help”, you should see o/p like this.



Friday, February 15, 2013

LINQ to Excell


I am going to share a code sample where I am going to read data from excell and use Linq Query to process that data.

            //declaring all variables that I will use
            Workbook workBook;
            IEnumerable<Sheet> workSheets;
            WorksheetPart excelSheet;
            string excellsheetid;
            List<FormTag> tags;
            SharedStringTable sharedStrings;

            //Code to open Excel File
              using (SpreadsheetDocument document =
                SpreadsheetDocument.Open(
                    @"C:\Temp\TestExcel.xlsx",
                    true))
              {
                  //References to the workbook and Shared String Table.
                  workBook = document.WorkbookPart.Workbook;
                  workSheets = workBook.Descendants<Sheet>();
                  sharedStrings = document.WorkbookPart.SharedStringTablePart.SharedStringTable;

                  //Reference to Excel Worksheet with Customer data.
                  excellsheetid =
                      workSheets.First(s => s.Name == "Sheet1").Id;

                  //Reading Excell Sheet
                  excelSheet =
                      (WorksheetPart)document.WorkbookPart.GetPartById(excellsheetid);


                  //LINQ query to skip first row with column names.
                  IEnumerable<Row> dataRows =
                      from row in excelSheet.Worksheet.Descendants<Row>()
                      where row.RowIndex > 1
                      select row;

                  //Looping through all rows after eliminating first row..assuming first row is a header row
                  foreach (Row row in dataRows)
                  {
                      //LINQ query to return the row's cell values.
                      //Where clause filters out any cells that do not contain a value.
                      //Select returns the value of a cell unless the cell contains
                      //  a Shared String.
                      //If the cell contains a Shared String, its value will be a 
                      //  reference id which will be used to look up the value in the 
                      //  Shared String table.
                      IEnumerable<String> textValues =
                          from cell in row.Descendants<Cell>()
                          where cell.CellValue != null
                          select
                              (cell.DataType != null
                               && cell.DataType.HasValue
                               && cell.DataType == CellValues.SharedString
                                   ? sharedStrings.ChildElements[
                                       int.Parse(cell.CellValue.InnerText)].InnerText
                                   : cell.CellValue.InnerText)
                          ;

                      //Check to verify the row contained data.
                      if (textValues.Count() > 0)
                      {
                          //Create your object for eg. a customer object and and manipulate it.
                          var textArray = textValues.ToArray();
                          Cutomer cust = new Cutomer();
                          cust.CustId = textArray[0];
                          cust.CustName = textArray[1];
                      }
                      else
                      {
                          //If no cells, then you have reached the end of the table.
                          break;
                      }
                  }
                  
              }

Friday, January 11, 2013

Delegates in C#



A method that is specified in an interface is implemented with the same name in the
base class. However, such close coupling is not always appropriate. The delegate construct
can be used to break the coupling for this purpose.

A delegate is a type that
defines a method signature. A delegate instance is then able to accept a method of that
signature, regardless of its method name or the type that encapsulates it.
The delegate syntax in C# evolved considerably from Versions 1.0 to 2.0 to 3.0. We
shall concentrate on the 3.0 version, which is the simplest to code. The language has
predefined standard generic delegate types, as follows:

        delegate R Func<R>();
        delegate R Func<A1, R>(A1 a1);
        delegate R Func<A1, A2, R>(A1 a1, A2 a2);
        // ... and up to 16 arguments

where R is the return type and the As and as represent the argument types and names,
respectively. Thus, declaring a delegate instance is now straightforward. For example,
we can define a Request delegate that takes an integer parameter and returns a string:

public Func<int, string> Request;

Next, we can assign an actual method to Request, as in:

Request = Target.Estimate;

The delegate can then be invoked just as any other method would be:

string s = Request(5);

This statement would invoke the Estimate method in the Target class, returning a
string.


Anonymous functions simplify the creation of one-time behavior for delegates. They are
useful when additional behavior is to be added before or after a method is invoked. For
example:

Request = delegate(int i) {
return "Estimate based on precision is " +
(int) Math.Round(Precise (i,3));
};

Here, the method to be invoked is Precise. The parameters are different from the ones
in the delegate, as is the return value. The anonymous function can wrapupthe
changes and assign a “complete solution” to the delegate for later invocation.


Delegates are used extensively in Windows GUI event-driven programming, where
they reflect the need to call back into the user’s code when some event happens.
Mostly, existing code of this type will use an older syntax. Also, because the new Func
delegates must have return types, void delegates must use the original syntax too. Consider
a simple example of wanting to inform one object that input has occurred in
another object (this is part of Example 4-4). We first declare a delegate visible to both
classes:

public delegate void InputEventHandler(object sender, EventArgs e, string s);

Then, in the class where the event is handled, we create an instance of the delegate and
add it to the event object of the class that will receive the event. When creating the delegate,
we indicate the method that it will call (in this case, OnInput):


   visuals.InputEvent += new InputEventHandler(OnInput);

        void OnInput(object sender, EventArgs e, string s)
        {
            // Do something
        }



The signature of OnInput must match that of InputEventHandler, which it does. Now,
in the class where event occurs, we declare the event:


       public event InputEventHandler InputEvent;

and in some method we invoke it:


       public void Input(object source, EventArgs e)
       {
           InputEvent(this, EventArgs.Empty, who);
       }

The action of invoking the InputEvent delegate causes the method currently assigned
to it (here, OnInput) to be invoked. Thus, the callback from one class to the other is
achieved.

More than one method can be associated with a delegate; when such a delegate is
invoked, all its methods are called. Thus, if another object needed to know about input
in the preceding example, it could add its own handler method on to InputEvent using
+=. Event handlers can be removed using -=

Adapter Design Pattern

The Adapter pattern helps in Integrating 2 classes which have altogether different Interfaces. It’s useful for off-the-shelf code, for toolkits, and for libraries.  Generally Toolkit or 3rd Party controls needs a lot of adaptor classes as in many scenario it’s not possible to use Toolkit’s interfaces.

Design:
In following UML class diagram , we have a Client class and Adaptee class. Adaptee class has method “SepecificRequest” which needs to be called by Client class. Client class uses an Adaptor class which implements ITarget interface and exposes Request method. Adapter class implements Request method and it’s a child object in Client Class. So, Client doesn’t need to know anything about Adaptee class all it has to know is about ITarget interface and Request method.


Implementation:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    // Existing way requests are implemented
    class Adaptee
    {
        // Provide full precision
        public double SpecificRequest(double a, double b)
        {
            return a / b;
        }
    }

    // Required standard for requests
    interface ITarget
    {
        // Rough estimate required
        string Request(int i);
    }

    // Implementing the required standard via Adaptee
    class Adapter : Adaptee, ITarget
    {
        public string Request(int i)
        {
            return "Rough estimate is " + (int)Math.Round(SpecificRequest(i, 3));
        }
    }

    class Client
    {
        public void CallRequest()
        {
            // Showing the Adapteee in standalone mode
            Adaptee first = new Adaptee();
            Console.Write("Before the new standard\nPrecise reading: ");
            Console.WriteLine(first.SpecificRequest(5, 3));

            // What the client really wants
            ITarget second = new Adapter();
            Console.WriteLine("\nMoving to the new standard");
            Console.WriteLine(second.Request(5));
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            Client cl = new Client();
            cl.CallRequest();
            Console.Read();
        }
    }
}


Output:


Depending on their Usage, there are following 2 types of Adapter classes

1) Pluggable Adapters : Developers who recognize that their systems will need to work with other components can increase their chances of adaptation. Identifying in advance the parts of the system that might change makes it easier to plug in adapters for a variety of new situations.

Keeping down the size of an interface also increases the opportunities for new
systems to be plugged in. Although not technically different from ordinary adapters, this feature of small interfaces gives them the name pluggable adapters.
A distinguishing feature of pluggable adapters is that the name of a method called by the client and that existing in the ITarget interface can be different. The adapter must be able to handle the name change. In the previous adapter variations, this was true for all Adaptee methods, but the client had to use the names in the ITarget interface.
Suppose the client wants to use its own names, or that there is more than one client and they have different terminologies.



2) Two-Way Adapters : Adapters provide access to some behavior in the Adaptee (the behavior required in the ITarget interface), but Adapter objects are not interchangeable with Adaptee objects. They cannot be used where Adaptee objects can because they work on the implementation of the Adaptee, not its interface. Sometimes we need to have objects
that can be transparently ITarget or Adaptee objects. 

This could be easily achieved if the Adapter inherited both interfaces; however, such multiple inheritance is not possible in C#, so we must look at other solutions.

The two-way adapter addresses the problem of two systems where the characteristics of one system have to be used in the other, and vice versa. An  Adapter class is set up to absorb the important common methods of both and to provide adaptations to both. The resulting adapter objects will be Acceptable to both sides. Theoretically, this idea can be extended to more than two systems, so we can have multiway adapters, but there are some implementation limitations: without multiple inheritance, we have to insert an interface between each original class and the adapter.