在我正在构建的设计中,我遇到了一个奇怪的问题.
我创建了一个<div>包含投票元素 - 它包含一个upvote按钮,downvote按钮和投票总计,每个都在他们自己的<div>元素中,并<img>用于按钮.
资源:
<div class="votebox">
<div class="vote"><img src="upvote.png" /></div>
<div class="votetotal">15</div>
<div class="vote"><img src="downvote.png" /></div>
</div>
Run Code Online (Sandbox Code Playgroud)
在我的CSS中的迷你重置中,两个<div>和<img>元素都被定义为没有边距或填充显示,并且FireBug确认这些特定元素没有边距或填充,但我看到在<img>元素的底部和底部之间添加了空格它们各自包含的元素.
我添加了以下CSS来显示每个元素周围的边框:
.votebox * {
border: 1px #000 solid;
}
Run Code Online (Sandbox Code Playgroud)
这就是它在Firefox 3.6中的显示方式(是的,那些是StackOverflow投票图像..我现在用它们作为占位符):

现在,这个问题的明显答案是简单地将"投票"类设置为具有明确的图像高度(我会这样做,甚至可能选择CSS精灵而不是<img>s),但我对它更感兴趣了解为什么这些元素以这种方式显示(毕竟这应该是一个自学项目).
任何人都可以为我阐明这一点吗?
编辑:史蒂夫H向我指出,我应该使用轮廓而不是边框来显示元素的外边缘.我做了这个改变,并且还将CSS中的元素分开,这样它们每个都显示为不同的颜色.
新大纲如下所示:

如您所见,问题与我想的有点不同.看起来图像下面有一些空白,但是底部图像似乎略微在其包含之外呈现这一事实<div>.这对我来说似乎很奇怪.
我一直在学习模型 - 视图 - 控制器范例("MVC"),但我很困惑,因为一些教程与其他教程相矛盾.
我目前对这个过程的理解看起来像这样:
这是从某些存储源(如数据库或XML文件)收集原始数据的位置.该模型用作抽象层,将Controller对特定数据的请求转换为(例如)SQL查询,并将查询结果转换为标准格式(如数据对象).
例如,在上面描述的/ browse/all场景中:
这是该应用程序的真正主力.除了在模型和视图中来回传递消息之外,Controller还负责授权等事务和应用程序/"业务"逻辑编辑:每个答案,业务逻辑属于模型.
在正在进行的示例中,Controller将负责:
例如
<html>
<head>
<title>
<?php $question->getTitle() ?>
</title>
</head> …Run Code Online (Sandbox Code Playgroud) 我正在开发我的第一个体面的PHP网站,我对在应用程序中处理干净/友好/漂亮的URL的"正确方式"(假设有这样的事情)有点困惑.
我看到它的方式,有两个主要选项(我将使用简化的社交新闻网站作为例子):
1.使用mod_rewrite处理所有潜在的URL.这看起来与以下内容相似但不完全相同:
RewriteRule ^article/?([^/]*)/?([^/]*)/?([^/]*) /content/articles.php?articleid=$1&slug=$2
RewriteRule ^users/?([^/]*)/?([^/]*) /content/users.php?userid=$1&username=$2
RewriteRule ^search/?([^/]*)/? /content/search.php?query=$1
Run Code Online (Sandbox Code Playgroud)
2.将所有内容传递给某个处理程序脚本,让它担心细节:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) handler.php?content=$1
Run Code Online (Sandbox Code Playgroud)
显然,这是所有未经测试的"航空代码",但你明白了.
我有一个文件夹,其中包含一些颠覆修订签出(运行capistrano部署配方时会检出这些签出).
我真正要做的是保持最新的3个版本,capistrano脚本检查并删除其他的,所以为此我计划在终端上使用运行命令运行一些命令,实际上capistrano没有得到任何东西在这里,但一个unix命令.
我试图运行一个命令来获取除最新三个文件之外的文件列表并删除其余文件,我可以使用以下命令获取文件列表.
(ls -t /var/path/to/folder |head -n 3; ls /var/path/to/folder)|sort|uniq -u|xargs
Run Code Online (Sandbox Code Playgroud)
现在如果我在这个命令的末尾添加一个rm -Rf,它会返回我找不到删除的文件.所以这很明显,因为这只返回文件夹的名称,而不是文件夹的完整路径.
无论如何使用一个unix命令删除这些文件/文件夹?
我是第一次编写PHP应用程序(玩具和练习除外),我很难理解为什么PHP包含一个include和一个require构造.
在你写一个解释两者之间差异的答案之前,让我首先说我确实理解了差异 - include产生警告并继续前进,并require产生致命错误.我的问题是:你想什么时候包括,但不需要文件?
也许这对我来说是想象力的失败,但我的应用程序中似乎没有任何文件,如果他们不在那里我不想尖叫.奇怪的是,这并没有让我想要使用,require因为它似乎无法正确处理失败require,所以我使用了一个帮助函数(警告:空气代码):
public static function include($filename) {
if (is_readable($filename)) {
if (!@include($filename)) {
throw new FileNotFoundException("File deleted after readable check");
}
} else {
throw new FileNotFoundException("File missing or unreadable");
}
}
Run Code Online (Sandbox Code Playgroud)
我想我要问的是:
假设您正在编写一个函数来检查是否通过相应的URL访问了某个页面.该页面有一个"规范"存根 - 例如,虽然可以通过stackoverflow.com/questions/123访问页面,但我们更愿意(出于搜索引擎优化的原因)将其重定向到stackoverflow.com/questions/123/how-do -i-move-the-turtle-in-logo - 实际的重定向安全地包含在自己的方法中(例如redirectPage($ url)),但是如何正确测试调用它的函数?
例如,采用以下功能:
function checkStub($questionId, $baseUrl, $stub) {
canonicalStub = model->getStub($questionId);
if ($stub != $canonicalStub) {
redirectPage($baseUrl . $canonicalStub);
}
}
Run Code Online (Sandbox Code Playgroud)
如果您要对checkStub()函数进行单元测试,重定向是否会妨碍?
这是一个更大问题的一部分,在这个问题中,某些功能似乎变得太大,并且离开了单元测试的领域并进入了集成测试的世界.我的想法立即认为路由器和控制器存在这些问题,因为测试它们必然导致页面的生成而不仅仅局限于它们自己的功能.
我只是在单元测试中失败了吗?
redirect unit-testing controller side-effects separation-of-concerns
我刚才在这里问过一些帮助理解MVC,因为我对这个话题很新.我认为我对它有一个很好的理解,这在我最近写的关于这个主题的博客文章中有记录.我的理解基本归结为:
控制器:确定完成请求需要执行的操作,并根据需要使用需要收集/修改的任何模型.它基本上是给定流程的管理者.
观点:仅限演示文稿.一旦控制器收集了它所需要的内容,它就会创建一个特定类型的视图,将信息交给它,并说"然后向用户显示这个视图".
模型:应用程序的行为.当控制器要求它提取或修改某些内容时,它知道如何操作.它还知道触发其他模型执行相关任务(在我的理解中,当模型试图在StackOverflow上"投票"时,该模型知道是否也应该因为它而授予徽章.控制器不会需要关心那个).
我的问题,假设所有这些或多或少准确,实体对象进来的地方?模型和实体是一样的,每个对象都知道如何持久保存自己的数据,或者实体是一个单独的概念,它们自己存在并在整个应用程序中使用?
我的钱是后者,因为这将允许模型独立行动,而所有三个层(模型,视图和控制器)可以利用实体根据需要传递数据.此外,对象和数据库持久性似乎应该分开的关注点.
说实话,我读的MVC越多,我就越困惑.我准备好采取核心概念(从逻辑中单独呈现)并以任何感觉正确的方式运行它,而不必过于担心"MVC"标签.
我一直在阅读关于依赖注入的内容,我理解一个方法应该从调用者那里获得它所需要的基本概念,而不是自己创建这样的项目.结果,new操作员几乎完全被从方法中删除了(当然,某些基本对象是免除的 - 我发现的一个例子是像StringBuilders这样的事情看起来像是疯了似乎必须传入).
我的问题听起来似乎很简单,但我怀疑答案实际上相当复杂:所有new运营商都去哪儿了?
答案似乎很简单:new操作符只是被推送到调用需要该对象的方法的方法.然而,问题在于,调用方法很可能也在测试中,因此new从调用方法推送到调用方法,直到最终到达root方法(此时似乎疯狂不可测试)会产生一个淫秽在调用堆栈中的各个点处使用的对象数量.当您认为根方法是各种其他方法的根时,情况变得更加复杂,因此需要为每种可能性创建对象.这也会产生一个性能问题,因为很快就会留下大量从未实际使用过的对象,但必须以"万一"方式实例化.
对我来说很明显,我错过了一些重要的知识,这对其他开发人员来说是如此明显,没有人想在博客文章中描述它.但是,我显然不知道我不知道的是什么,所以我谦卑地问我是否被允许进入这个秘密:所有的new经营者都去了哪里?
我应该提一下,我正在使用PHP进行开发,因此每个请求都在同一点开始,似乎根"方法" index.php需要涵盖应用程序可以执行的所有操作,以确保它为所有内容提供对象它会在当前请求做.再次,这里有一个根本的误解,我真的很想纠正它.
我一直在尝试查看CodePlex上的一些项目,试图了解其他人如何设计他们的应用程序.我试图在C#2008 Express中打开这些项目时遇到了一些麻烦.当我打开解决方案或csproj文件时,我遇到此错误消息:
无法打开'Foo.csproj',因为此版本的应用程序不支持其项目类型(.csproj).
要打开它,请使用支持此类项目的版本.
当我打开自己创建的项目时,这不会发生.外部项目甚至在2005年以这种格式自动转换,但在尝试打开转换后的文件时会窒息.
这是Express版本的限制,还是我可以做些什么来解决这个问题?
我尝试用谷歌搜索,但我发现的结果不太有帮助.
谢谢!
更新:
@JaredPar要求我打开时遇到困难的具体项目.
众所周知的"打破骆驼的稻草"被称为Continuum,但我也遇到了CodePlex上的其他项目以及Paint.NET源的困难.
我已经尝试卸载并重新安装,但问题仍然存在.
@brianpeiris请求我的安装规范:
Visual Studio
Microsoft Visual Studio 2008
版本9.0.30729.1 SP
Microsoft .NET Framework
版本3.5 SP1
已安装版:C#Express
Microsoft Visual C#2008 91910-152-0000061-60196
用于Microsoft Visual C#2008 Express Edition SP1的
修补程序- ENU(KB945282)KB945282 用于Microsoft Visual C#2008 Express Edition SP1的
修补程序- ENU(KB946040)KB946040 Microsoft Visual C#2008 Express修补程序SP1版本 - ENU(KB946308)KB946308
适用于Microsoft Visual C#2008 Express Edition SP1的修补程序- ENU(KB947540)KB947540 适用于Microsoft Visual C#2008 Express Edition SP1的
修补程序 - ENU(KB947789)KB947789
系统
系统:
Microsoft Windows XP
Professional
版本2002 …
php ×2
apache ×1
architecture ×1
bcd ×1
controller ×1
css ×1
entity ×1
friendly-url ×1
hex ×1
html ×1
image ×1
include ×1
mod-rewrite ×1
model ×1
redirect ×1
rendering ×1
require ×1
side-effects ×1
tdd ×1
unit-testing ×1
unix ×1
whitespace ×1