Here's a quick implementation using xkeyval just to give an idea of what can be done using this approach:

\documentclass{article}
\usepackage{wasysym,xkeyval}% http://ctan.org/pkg/{wasysym,xkeyval}
\makeatletter
\define@cmdkey{address}{type}{}
\define@cmdkey{address}{name}{}
\define@cmdkey{address}{phone}{}
\define@cmdkey{address}{address}{}
\newcommand{\makeaddress}[1][]{%
{\setkeys{address}{type=,name=,phone={555-555-5555},address=,#1}%
\begin{description}
\item[Address Type:] %\cmdKV@address@type
\def\addresschoice@type{home}\ifx\addresschoice@type\cmdKV@address@type\relax\XBox Home%
\else\def\addresschoice@type{work}\ifx\addresschoice@type\cmdKV@address@type\relax\Square Work
\else None\fi\fi
\item[Name:] \cmdKV@address@name
\item[Phone:] \cmdKV@address@phone
\item[Address:] \cmdKV@address@address
\end{description}
}}
\makeatother
\begin{document}
\makeaddress[name={John Doe},address={100 1st Street, New York, NY},phone={123-456-7890},type=home]
\bigskip
\makeaddress[name={Jane Doe},address={Unknown}]
\end{document}
The main advantage would be that you can specify defaults for keys if they're not supplied, limit certain inputs to specific values and mix them in any order you like. You'll have to peruse the xkeyval documentation to view all the possibilities. I don't think my code is the most optimal or uses all the benefits of xkeyval, but at least it shows a proof of concept that should fit your use case.