Archive for category Uncategorized
Resharper does not promote IoC
Posted by reshefm in Uncategorized on September 3rd, 2009
I just upgraded to resharper 4.5 and got this note:
It is never instantiated since I use IoC container
Code semantics
Posted by reshefm in Uncategorized on March 23rd, 2008
As I started a new job I was introduced to a new codebase. This happens to any developer who is starting a new job or a new role.
Since people are different, their approaches towards code is different as well, and were one developer gives his data-access interfaces and objects the suffix ‘DAO’, another developer will suffix it with ‘Repository’, hence, we might get ‘ICoustomerDAO’ or ‘ICustomerRepository’.
The meaning is the same - a service that is charge of storing and retrieving information about a customer.
As I mentioned at the beginning, I was recently introduced to a new codebase that has its own semantics. Some of these semantics were trivial like using the convention of ‘Sink’. I immediately understood that a sink is a recipient of data and it is the end of the road for this data. Examples are ConsoleSink which writes to the console and DBSink which writes to the database.
This however, is a simple example as a system is more complex than that. There are other "hidden" semantics that are just the result of differences between people and the way they things.
The example I used with the DAO/Repository in taken from the semantics of Domain-Driven Development (DDD) which gives very high importance to the way things are expressed. The base for DDD is first of all defining an ubiquitous language that is used to define the entities in the system and the relations between them.
I believe that if a software project will have a defined semantics, the amount of the mess that is usually a part of a codebase will dramatically be reduced, it will be easier to get familiar with the code and maintenance will be easier.
ref/out key words for reference types
Posted by reshefm in Uncategorized on November 15th, 2007
This tip is the courtesy of Gal.
It surprised and embarrassed me to realize that I didn’t know it.
When a reference type is passed to a method without using the ref or out keywords, a new reference is created inside the method and it points to the same location in the memory as the reference that was passed so we have two “pointers” to the same location in memory.
In case the the reference inside the method is set to a different location, the reference that was passed does not change.
When the ref/out keywords are used, we have only one reference inside and outside the method so if the reference is changed to point to another location and it happens inside the method, the outer reference is changed too.
Basic stuff…
ThreadStatic attribute
Posted by reshefm in Uncategorized on November 15th, 2007
According to the msdn documentation, the ThreadStatic attribute “Indicates that the value of a static field is unique for each thread.”
A practical use for it can be a registrar implementation. A registrar can be used as a static entry point to store context data for say, a request that is being processed by several classes that need to share data.
Implementation example:
public static class Registrar{ [ThreadStatic] private static Dictionary<string, object> m_registrar = null; private static Dictionary<string, object> LocalDictionary { get { if (m_registrar == null) { m_registrar = new Dictionary<string, object>(); } return m_registrar; } } public static object Get(string key) { return LocalDictionary[key]; } public static void Set(string key, object value) { LocalDictionary[key] = value; }}
Now since the m_registrar is marked with ThreadStatic attribute, is static per thread, which means that no locking is required and no data corruption can occur.
A real world example for using such strategy is HttpContext.Items
Gilad pointed out two important points:
- ASP.NET is changing threads under the hood so don’t use it there since u will most probably get your data corrupted. The HttpContext knows how to handle that so use it.
- When using a thread pool, the threads are not killed and so when a thread completes execution and returned to the pool, the static data is still kept. In this case u should use an execution wrapper than clears the per thread static data after the thread complete execution.
Data Type aliasing
Posted by reshefm in Uncategorized on November 14th, 2007
There is a feature in .net that is not commonly remembered and it is Data Type aliasing.
What it means is that u give a data type a different name.
I can see two uses for it:
1) Enhance code readability:
Instead of having very long type declarations such as when using generic types inside generic types, u can assign an alias to that declaration. Here is an example:
// Aliasing using HashOfHashes = Dictionary<string, Dictionary<string, List<string>>>;
public class AliasExample { HashOfHashes m_hash;
public AliasExample() { m_hash = new HashOfHashes(); }
public HashOfHashes MyHash { get { return m_hash; } } }
2) Alias data types that are prone to change:
An example is an identifier property of class. It can save a lot find&replace when changing code like changing the identifier of a member from int to Guid and it better shows intent. For example:
// Aliasing using MemberIdentidfier = Guid;
public class MemberWithAlias { private MemberIdentidfier m_id; private string m_name;
public MemberWithAlias (MemberIdentidfier id) { m_id = id; }
public MemberIdentidfier Id { get { return m_id; } }
public string Name { get { return m_name; } set { m_name = value; } } }
Primitive but efficient way for profiling (on development machine)
Posted by reshefm in Uncategorized on November 14th, 2007
Small thing I read about. It is so simple and obvious but I never thought about it…
In the lack of a decent profiler,
if u observe that a certain process takes a large amount of time (such as system startup),
start the debugger and while the time consuming task is running, click the pause button in VS.
Now take a look at the call stack to see which method take the time to execute.
