C ++ 'da typedef kullanması gerekip gerekmediği konusunda biraz kafam karıştı. Okunabilirlik ve netlik arasında dengeleyici bir hareket olduğunu hissediyorum.
İşte herhangi bir typedefs olmadan bir kod örneği:
int sum(std::vector<int>::const_iterator first,
std::vector<int>::const_iterator last)
{
static std::map<std::tuple<std::vector<int>::const_iterator,
std::vector<int>::const_iterator>,
int> lookup_table;
std::map<std::tuple<std::vector<int>::const_iterator,
std::vector<int>::const_iterator>, int>::iterator lookup_it =
lookup_table.find(lookup_key);
if (lookup_it != lookup_table.end())
return lookup_it->second;
...
}
Oldukça çirkin IMO. Bu yüzden, daha güzel görünmesi için işlev içine bazı typedefs ekleyeceğim:
int sum(std::vector<int>::const_iterator first,
std::vector<int>::const_iterator last)
{
typedef std::tuple<std::vector<int>::const_iterator,
std::vector<int>::const_iterator> Lookup_key;
typedef std::map<Lookup_key, int> Lookup_table;
static Lookup_table lookup_table;
Lookup_table::iterator lookup_it = lookup_table.find(lookup_key);
if (lookup_it != lookup_table.end())
return lookup_it->second;
...
}
Kod hala biraz sakar, ama çoğu kabus malzemesinden kurtuluyorum. Ancak hala int vektör yineleyicileri var, bu varyant bunlardan kurtuluyor:
typedef std::vector<int>::const_iterator Input_iterator;
int sum(Input_iterator first, Input_iterator last)
{
typedef std::tuple<Input_iterator, Input_iterator> Lookup_key;
typedef std::map<Lookup_key, int> Lookup_table;
static Lookup_table lookup_table;
Lookup_table::iterator lookup_it = lookup_table.find(lookup_key);
if (lookup_it != lookup_table.end())
return lookup_it->second;
...
}
Bu temiz görünüyor, ama yine de okunabilir mi?
Ne zaman bir typedef kullanmalıyım? Kabus tipim olur olmaz? Bir kereden fazla meydana gelir gelmez? Onları nereye koymalıyım? Bunları işlev imzalarında kullanmalı mıyım yoksa uygulamaya koymalı mıyım?
typedef Input_iterator std::vector<int>::const_iterator;
geriye
#define
aint yeterince iyi.