它开始于我使用iPod Touch的一天:将iPhone上的XXX功能(来自我们的内部桌面应用程序)作为本机应用程序提供并不是很酷.
我之所以有这样的想法,是因为(A)我认为我们目前庞大的桌面内部6年以上的应用程序套件需要一个重要的改进,而且(B)而不是继续我们的瀑布式开发方法,这通常导致一个项目在数十人之后罐装在没有用户关心的事情上花费数月时间.我希望我们可以使用敏捷方法开始做2周迭代周期的大量小项目.
哦,我也想找个办公室使用XCode的借口.
经过研究,我发现几乎没有公司的iPhone本机内部网应用程序,因为没有公司希望他们的内部开发需要由苹果控制,苹果往往会杀掉像Google Talk这样的酷应用程序.由于我们公司对安全性和安全性非常关注,"使用越狱的iPhone/iPod Touch"这句话与"请解雇我"的说法相同.
所以我提出了计划B:使用ComponentOne iPhone Studio来做iPhone优化的Intranet Web应用程序.我花了2周多的时间才完成了.我的主管似乎对此感到非常兴奋,所以希望我们可以把它变成一个长期的项目.
我的问题是:你们有没有尝试过为公司的内部使用编写iPhone应用程序(本机应用程序或基于Web的应用程序),以及技术和政治方面的挑战是什么?
我想编写解密和干净的代码,我知道通过编程到接口而不是实现,我的代码将更灵活和可扩展.所以,而不是写如下方法:
bool IsProductAvailable(ProductTypeA product);
Run Code Online (Sandbox Code Playgroud)
我写的方法如下:
bool IsProductAvailable(IProduct product);
Run Code Online (Sandbox Code Playgroud)
只要我的产品实现IP产品:
class ProductTypeA : IProduct
Run Code Online (Sandbox Code Playgroud)
我应该没事.一切顺利,直到我开始使用泛型集合.由于C#3.0不支持协变和逆变,即使ProuctTypeA和ProductTypeB都实现了IProduct,也不能将List放入List中.这很麻烦,因为很多时候我想写一些类似的东西:
bool AreProductsAvailable(List<IProduct> products);
Run Code Online (Sandbox Code Playgroud)
这样我就可以通过以下方式检查产品的可用性:
List<ProductA> productsArrived = GetDataFromDataabase();
bool result = AreProductsAvailable(productsArrived);
Run Code Online (Sandbox Code Playgroud)
我想只编写一个适用于所有IProduct集合的AreProductsAvailable()方法.
我知道C#4.0将支持协变和逆变,但我也意识到其他库似乎已经解决了问题.例如,我正在尝试ILOG Gantt甘特图控件,并发现他们有很多集合接口,如下所示:
IActivityCollection
ILinkCollection
Run Code Online (Sandbox Code Playgroud)
所以看起来他们的方法是使用接口包装泛型集合.因此,我可以这样做,而不是"bool AreProductsAvailable(List products);"
bool AreProductsAvailable(IProductCollection products);
Run Code Online (Sandbox Code Playgroud)
然后编写一些代码,以便IProductCollection获取IProduct的任何通用集合,无论是List还是List.
但是,我不知道如何编写一个"魔术"的IProductCollection接口.: - <(ashame)....
有人能给我一些光明吗?这已经困扰了我很久了,我也想做"正确的事".非常感谢!